如果直接查询是唯一可用的选项(没有参数化查询或sprocs),可以采取什么措施来防止SQL注入

时间:2012-01-22 13:02:08

标签: sql sql-server asp-classic sql-injection

很抱歉这个长标题,不希望人们只是阅读标题,而不是问题然后去'复制xxx'当实际xxx是关于sprocs等...

所以我处在一种我可以使用的方式非常有限的情况。我仅限于使用经典ASP并仅使用直接查询进行查询 - 即没有存储过程或参数化查询。

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

我已经阅读了一下,但到处都是说参加参数化查询或sprocs,这显然不适合我。

鉴于我的限制,有人可以给我一些指示,说明如何使我的应用程序尽可能安全吗?提前谢谢。

3 个答案:

答案 0 :(得分:3)

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

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

看一下这篇文章,答案中的链接很好地解释了如何继续。

Parameterized queries WITHOUT stored procedures?

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

答案 1 :(得分:1)

您可以通过将更严格的算法放入输入验证来强制实施安全性:

  • 限制用户输入的长度
  • 限制用户输入中使用的符号
  • 逃避潜在的特殊角色。

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

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

答案 2 :(得分:0)

您可以使用实现javax.servlet.Filter的类。此过滤器将拦截任何进入写入sql代码的servlet的请求。 然后使用在过滤器类的doFilter()中调用的ServletRequestWrapper,您可以对用户输入进行验证。 Servlet中获取用户输入的request.getparameter方法将被ServletRequestWrapper的getparameter覆盖。 在此方法中,您可以编码用户输入中存在的所有特殊字符。 这是防止SQL注入,XSS攻击最有效的方法