Security SQL注入或Server.HTMLEncode或两者?经典ASP

Security SQL注入或Server.HTMLEncode或两者?经典ASP,security,asp-classic,sql-injection,html-encode,Security,Asp Classic,Sql Injection,Html Encode,人们说,为了防止SQL注入,您可以执行以下操作之一(以及其他操作): 准备语句(参数化) 存储过程 转义用户输入 我已经完成了第1项,准备我的语句,但我现在想知道是否也应该逃避所有用户输入。这看起来是在浪费时间,因为我已经准备好了陈述,还是这会使我预防的机会增加一倍?在我不得不做经典ASP的那一天,我同时使用了方法2和3。我更喜欢存储过程的性能,它有助于防止SQL注入。我还使用了一组标准的include来过滤(转义)用户输入。为了真正的安全,不要使用经典的ASP,但是如果必须的话,我会全部使用这

人们说,为了防止SQL注入,您可以执行以下操作之一(以及其他操作):

  • 准备语句(参数化)
  • 存储过程
  • 转义用户输入

  • 我已经完成了第1项,准备我的语句,但我现在想知道是否也应该逃避所有用户输入。这看起来是在浪费时间,因为我已经准备好了陈述,还是这会使我预防的机会增加一倍?

    在我不得不做经典ASP的那一天,我同时使用了方法2和3。我更喜欢存储过程的性能,它有助于防止SQL注入。我还使用了一组标准的include来过滤(转义)用户输入。为了真正的安全,不要使用经典的ASP,但是如果必须的话,我会全部使用这三种方法。

    除了使用参数化语句外,通常要逃避输入是浪费时间的。如果您使用的是数据库供应商提供的数据库“驱动程序”,并且使用参数化 语句,而不进行SQL字符串连接或尝试参数化实际SQL语法,而不只是提供变量值,那么您已经尽可能安全了

    总而言之,您最好的选择是信任数据库供应商知道如何在他们自己的SQL实现中转义值,而不是尝试运行您自己的编码器,这对于很多数据库来说可能比您想象的要多得多


    如果除此之外,您还需要额外的保护,可以尝试使用SQL监控解决方案。有一些可以从普通SQL查询中发现并阻止/标记它们,或者只是尝试了解您的默认应用程序行为并阻止其他一切。显然,根据您的设置和使用情况,您的里程数可能会有所不同。

    首先,关于一般的喷射:

    后两者实际上与注射无关。
    而前者并没有涵盖所有可能的问题

  • 在您必须处理
    标识符之前,准备好的语句是可以的
  • 存储的provedures也容易被注入。这根本不是一个选择
  • “转义”“用户输入”是其中最有趣的
  • 首先,我认为,“转义”仅用于字符串,而不是任何“用户输入”。逃逸所有其他类型是毫无用处的,不会保护任何东西。
    接下来,说到字符串,您必须将它们全部转义,而不仅仅是来自用户输入。
    最后-不,如果使用准备好的语句,则不必使用任何转义

    现在谈谈你的问题

    您可能会注意到,
    HTMLEncode
    中没有包含“SQL”一词。人们可能会认为,
    Server.HTMLEncode
    与SQL注入完全无关。

    它更像是另一种攻击预防,称为XSS。在这里,这似乎是一个更合适的操作,实际上应该用于不受信任的用户输入

    因此,您可以将
    Server.HTMLEncode
    与准备好的语句一起使用。但请记住,这是完全不同的攻击预防


    您还可以考虑在实际HTML输出之前使用HTMLNEnCODE,而不是在存储数据时使用。

    < P>当然,防止SQL注入攻击的第一步是始终使用参数化查询,从不将客户端提供的文本连接到SQL字符串中。一旦您采取了参数化步骤,存储过程的使用就不再重要了

    但是,还有一个SQL注入的辅助源,SQL代码本身(通常在SP中)必须组成一些SQL,然后执行。因此,即使您的ASP代码始终使用参数化查询,它仍然可能对注入无效。如果您可以确定,您的SQL中没有一个能够做到这一点,也永远不会做到这一点,那么您就可以相当安全地避免SQL注入。根据您正在执行的操作以及使用的SQL Server版本,有时SQL合成SQL是不可避免的

    考虑到上述情况,健壮的方法可能需要您的代码检查传入的字符串数据中的SQL模式。这可能是相当紧张的工作,因为攻击者在避免SQL模式检测方面会变得非常复杂。即使您觉得所使用的SQL是不可攻击的,但即使失败了,也能检测到这种尝试是有用的。能够获取并记录关于承载尝试的HTTP请求的附加信息是很好的

    转义是最可靠的方法,在这种情况下,使用数据库中数据的代码必须理解转义机制,并且能够取消转义数据以利用它。例如,设想一个服务器端报告生成工具在将数据库字段包含在报告中之前需要对其进行取消扫描

    Server.HTMLEncode
    防止不同形式的注入。如果没有它,攻击者可以将HTML(包括javascript)注入到站点的输出中。例如,假设有一个店面应用程序,允许客户查看产品以供其他客户阅读。恶意的“客户”可能会注入一些HTML,使他们能够收集阅读他们对流行产品的“评论”的其他真实客户的信息


    因此,始终对从数据库检索到的所有字符串数据使用
    Server.HTMLEncode

    您还可以验证用户输入“为了真正安全,不要使用经典ASP”。您能否解释经典ASP比我们需要“真正安全”时必须使用的其他技术更脆弱?有许多专门为经典ASP设计的黑客。最糟糕的情况之一是强制查看页面源代码。如果你运行的是经典的ASP,而你的服务器没有被严格锁定,那你就是在等着被烤面包。我为ASP编写代码已经很多年了,这是我第一次听说需要“锁定”