2009-10-06 67 views
7

最近,我继承了传统的ASP网站一吨的内联SQL INSERT语句是容易受到SQL注入攻击。经典ASP SQL注入

这些插入语句经由ADO命令对象执行。

将ADO命令对象的Prepared属性设置为true可确保查询在执行前参数化,从而减轻SQL注入的风险?

+2

[经典ASP SQL注入保护]的可能重复(http://stackoverflow.com/questions/149848/classic-asp-sql-injection-protection) – NotMe

回答

6

没有,如果你建立与您直接从“外部”获得值的SQL字符串,那么,“准备好的声明”不会帮助你。

一个

sSQL = "SELECT * from mytable where mycolumn = '" + querystring("value") + "'" 

仍然找麻烦。 解决此问题的唯一方法是在查询中使用参数。

-2

我会建议你要做的就是写一个函数来清理用户的输入,然后通过运行的所有请求变量。当我写我的我的东西,如:

  • 逃逸单引号,
  • 删除;和其他特殊字符和
  • 确保您不能 - (评论)出来的语句的结束。

大多数SQL注入会尝试像' or 1=1 or a=' 所以SQL代码如下:

SELECT * from mytable where mycolumn = '' or 1=1 or a='' 

所以逃逸单引号是真正的大个,你不必担心。

+1

很多人陷入了这个陷阱。创建函数使得代码不易读,并且不是未来的证明。我无法跟踪几年前建立的所有经典ASP网站,更不用说更新他们可能使用或可能不使用的功能。 ADO参数或参数存储过程是要走的路。 –

+0

我同意参数是最佳做法,但如果您试图快速清理一堆代码然后将所有用户输入包装在一个函数中更容易 –

+1

我不认为需要很长时间才能添加一堆'oCmd.Parameters在你的代码中添加oCmd.CreateParameter(...)'语句,并且在这样的情况下,我认为你最好关注质量而不是速度,特别是如果你没有时间做两次这样的工作。 –