使用替换单引号和验证整数的SQL注入

Mah*_*asi 1 c# sql sql-server sql-injection sql-server-2005

可能重复:
我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗?

我只是想知道,如果我每更换'''的用户输入,例如string.Replace("'","''"),和验证号码(确保它们是数字,不包含任何其他字符),是SQL注入仍然是可能的?怎么样?

我正在使用动态SQL查询SqlCommand.像这样的东西:

cmd.CommandText = "SELECT * FROM myTable WHERE ID = " + theID.ToString();
Run Code Online (Sandbox Code Playgroud)

要么

cmd.CommandText = "UPDATE myTable SET title='" + title.Replace("'","''") + "' WHERE ID = " + theID.ToString();
Run Code Online (Sandbox Code Playgroud)

在ASP.NET MVC中自动验证输入整数(检查它们是否是实数).

Mar*_*ith 9

如果这是一个以这种方式编码的遗留项目,那么虽然不是最优的,但我目前还没有意识到它可以容易受到SQL注入的影响,只要每个字符串都以这种方式处理并且查询很简单如你所示.

然而,我不能说明这一点.如果不使用参数化查询,则总有可能存在一些尚未考虑的漏洞.

手动逃避引号本身容易出错,有时会以提前难以预料的方式失败.例如,使用下表

CREATE TABLE myTable(title VARCHAR(100))
INSERT INTO myTable VALUES('Foo')
Run Code Online (Sandbox Code Playgroud)

并使用动态SQL建立的字符串连接存储过程

CREATE PROC UpdateMyTable
@newtitle NVARCHAR(100)
AS
/*
Double up any single quotes
*/
SET @newtitle = REPLACE(@newtitle, '''','''''')

DECLARE @UpdateStatement VARCHAR(MAX)

SET @UpdateStatement = 'UPDATE myTable SET title='''  + @newtitle + ''''

EXEC(@UpdateStatement)
Run Code Online (Sandbox Code Playgroud)

您可以尝试以下方法

正常更新

EXEC UpdateMyTable N'Foo'
SELECT * FROM myTable /*Returns "Foo"*/
Run Code Online (Sandbox Code Playgroud)

SQL注入尝试被挫败了

EXEC UpdateMyTable N''';DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "';DROP TABLE myTable--"*/
Run Code Online (Sandbox Code Playgroud)

SQL注入尝试成功并删除表

EXEC UpdateMyTable N'?;DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "Invalid object name 'myTable'."*/
Run Code Online (Sandbox Code Playgroud)

这里的问题是第三个查询通过U + 02BC而不是标准撇号,然后varchar(max)在卫生发生之后将字符串分配给a ,它将其静默地转换为常规撇号.

在我阅读这里的答案之前,我永远不会想到这个问题.

  • 您的最后一个(U+02BC)是一个很好的例子,谢谢。 (2认同)