如果直接查询是唯一可用的选项(没有参数化查询或存储过程),可以做些什么来防止SQL注入



很抱歉标题太长,不希望人们只阅读标题,而不是问题,然后去"重复xxx",而实际上xxx是关于存储过程等的…

所以我现在的处境是,我所能使用的东西非常有限。我仅限于经典的ASP和仅使用直接查询的查询,即没有存储过程或参数化查询。

我有什么选择?我正在考虑替换某些符号,如果可以的话,但我认为在某些情况下,某些符号需要通过。我知道我为之编写此脚本的应用程序将所有'替换为'';这应该足以绕过' or 1 = 1黑客攻击,但我不知道还有什么其他主要风险需要预防。

我读了一些,但到处都在说要使用参数化查询或sproc,这显然不是我的选择

有人能给我一些建议吗?考虑到我的局限性,我可以做些什么来让我的应用程序尽可能安全?提前谢谢。

我不知道你不想在经典ASP中使用参数化查询的原因是什么,但你肯定可以。

这比在ASP.NET中使用它们有点棘手,但没有理由不能使用它们。

看看这篇文章,答案中的链接很好地解释了如何进行。

没有存储过程的参数化查询?

如果你真的不想使用这种类型的查询,你可以像你说的那样用"代替"。我们已经用一些遗留应用程序做了很长一段时间了,SQL注入没有任何问题。

您可以通过在输入验证中使用更严格的算法来加强安全性:

  • 限制用户输入的长度
  • 限制用户输入中使用的符号
  • 转义潜在的特殊字符

例如,如果用户输入是数字,则可以验证是否只输入了字符0..9。

如果用户正在提供文本输入,并且您希望允许特殊文本,请考虑限制可以输入的文本,以避免使用特殊字符。如果允许使用特殊字符,请确保ASP脚本检测并转义这些字符,以便将它们视为普通文本。

您可以使用一个实现javax.servlet.Filter的类。该筛选器将拦截任何发送到编写sql代码的servlet的请求。然后,使用在filter类的doFilter()中调用的Servlet RequestWrapper,可以对用户输入进行验证。servlet中接受用户输入的request.getparameter方法将被servlet RequestWrapper的getparameter覆盖。在这种方法中,您可以对用户输入中的所有特殊字符进行编码。这是防止SQL注入、XSS攻击的最有效方法

最新更新