SQL注入或Server.HTMLEncode或两者兼而有之?经典ASP

The*_*ver 6 security sql-injection html-encode asp-classic

人们说为了防止SQL注入,你可以做以下其中一件事(其中包括):

  1. 准备陈述(参数化)
  2. 存储过程
  3. 转义用户输入

我已完成第1项,准备我的陈述,但我现在想知道是否应该逃避所有用户输入.这是浪费时间,因为我准备好了陈述,还是这会增加预防的机会?

Ant*_*nes 2

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

然而,还有一个 SQL 注入的次要来源,其中 SQL 代码本身(通常在 SP 中)必须编写一些 SQL,然后执行。因此,即使您的 ASP 代码始终使用参数化查询,它仍然可能容易受到注入攻击。如果您可以确定您的 SQL 中没有一个也不会这样做,那么您就相当安全,不会受到 SQL 注入的影响。根据您正在执行的操作以及您使用的 SQL Server 版本,有时 SQL 组合 SQL 是不可避免的。

考虑到上述情况,稳健的方法可能需要您的代码检查传入字符串数据的 SQL 模式。这可能是一项相当繁重的工作,因为攻击者可以非常熟练地避免 SQL 模式检测。即使您认为您使用的 SQL 不易受到攻击,能够检测到此类尝试(即使它们失败)也是有用的。能够获取并记录有关携带尝试的 HTTP 请求的附加信息是很好的。

转义是最可靠的方法,在这种情况下,尽管使用数据库中数据的所有代码都必须了解转义机制并能够转义数据以利用它。例如,想象一下服务器端报告生成工具,在将数据库字段包含在报告中之前需要对数据库字段进行转义。

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

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