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

Jef*_*rey 0 sql-server asp-classic

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

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

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

Aar*_*and 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
Run Code Online (Sandbox Code Playgroud)

您目前依赖的方法并不安全.假设您在ASP页面中嵌入了以下动态SQL:

sql = "SELECT Name FROM dbo.Students WHERE Id = " & Request("StudentId") 
Run Code Online (Sandbox Code Playgroud)

现在让我们说有人决定尝试将以下内容插入查询字符串(或表单,或者你有什么):

1; DROP TABLE dbo.Students;
Run Code Online (Sandbox Code Playgroud)

如何用单引号替换此字符串有助于避免SQL注入?如果您知道,您可能会这样做:

sql = "SELECT Name FROM dbo.Students WHERE Id = " & CLng(Request("StudentId"))
Run Code Online (Sandbox Code Playgroud)

所以现在你必须进入并重新编写这段代码,并找到打开注入的数据类型不是字符串的情况.

SQL注入不仅仅通过利用单引号来定义.根据您构建SQL字符串的方式,可能还有十几种其他方法可以执行此操作.如果您想通过保护这些案件来感到安全,那取决于您.我不会.我会正确地参数化所有类型安全的查询.消除所有问题,即使前期成本可能很高,您也会在晚上睡得更好.