我们有一些连接到MS SQL server数据库的经典ASP页。为了防止SQL注入,我们只需将所有单引号替换为双单引号。这似乎就是这里规定的方法:http://www.4guysfromrolla.com/webtech/061902-1.shtml
这对我来说还是很危险。有没有办法用其他字符转义单引号,从而可能打开SQL注入?
编辑:)我们目前有很多旧代码使用这个单引号来替换双单引号。如果这足以防止SQL注入,那么我们不会做任何更改。我真正的问题是这种方法是否不安全。
发布于 2012-09-26 23:17:48
使用参数化查询。如果您不使用连接将您的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字符串的方式,可能还有十几种其他方法可以做到这一点。如果你想通过保护这些箱子来获得安全感,那是你的事。我不会。我会正确地参数化所有类型安全的查询。消除了所有问题,即使前期成本可能很高,您也会在晚上睡得更好。
https://stackoverflow.com/questions/12604849
复制相似问题