我们有一些连接到MS SQL服务器数据库的经典ASP页面。为了防止SQL注入,我们只需用双引号替换所有单引号。这似乎是这里规定的方法:http://www.4guysfromrolla.com/webtech/061902-1.shtml
这对我来说仍然很危险。有没有办法逃避单引号与任何其他字符,可能会打开SQL注入?
编辑:)我们目前有很多旧代码使用此单引号来双倍单引号替换。如果这足以阻止SQL注入,那么我们不会改变任何东西。我真正的问题是这种方法是否不安全。
答案 0 :(得分:8)
使用参数化查询。如果您不使用串联来共同处理SQL语句,则会为您处理单引号。例如:
Set objCommand = CreateObject("ADODB.Command")
With objCommand
.CommandText = "INSERT dbo.Table(Column) values (?)"
.CommandType = adCmdText
.ActiveConnection = "Connection string" or existing open connection
.Parameters.Append .CreateParameter("@p1", adVarChar, adParamInput, 50, "O'Brien")
.Execute
Set .ActiveConnection = Nothing
End With
您目前依赖的方法是不安全。假设您在ASP页面中嵌入了以下动态SQL:
sql = "SELECT Name FROM dbo.Students WHERE Id = " & Request("StudentId")
现在让我们说有人决定尝试将以下内容插入查询字符串(或表单,或者你有什么):
1; DROP TABLE dbo.Students;
如何用单引号替换此字符串有助于避免SQL注入?如果您知道,您可能会这样做:
sql = "SELECT Name FROM dbo.Students WHERE Id = " & CLng(Request("StudentId"))
所以现在你必须进入并重新编写这段代码,并找到那些打开注入的数据类型不是字符串的情况。
SQL注入不仅仅通过利用单引号来定义。根据您构建SQL字符串的方式,可能还有十几种其他方法可以执行此操作。如果您想通过保护这些案件来感到安全,那取决于您。我不会。我会正确地参数化所有类型安全的查询。消除所有问题,即使前期成本可能很高,您也会在晚上睡得更好。