是否可以在没有其他单引号的情况下逃避SQL Server中的单引号?

时间:2012-09-26 15:09:38

标签: sql-server asp-classic

我们有一些连接到MS SQL服务器数据库的经典ASP页面。为了防止SQL注入,我们只需用双引号替换所有单引号。这似乎是这里规定的方法:http://www.4guysfromrolla.com/webtech/061902-1.shtml

这对我来说仍然很危险。有没有办法逃避单引号与任何其他字符,可能会打开SQL注入?

编辑:)我们目前有很多旧代码使用此单引号来双倍单引号替换。如果这足以阻止SQL注入,那么我们不会改变任何东西。我真正的问题是这种方法是否不安全。

1 个答案:

答案 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字符串的方式,可能还有十几种其他方法可以执行此操作。如果您想通过保护这些案件来感到安全,那取决于您。我不会。我会正确地参数化所有类型安全的查询。消除所有问题,即使前期成本可能很高,您也会在晚上睡得更好。