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

时间:2012-09-02 10:36:29

标签: c# sql sql-server sql-server-2005 sql-injection

  

可能重复:
  Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?

我只是想知道,如果我在用户输入中用{{​​1}}替换每个',例如'',并验证数字(确保它们是数字,而不是包含任何其他字符),SQL注入仍然可能吗?怎么样?

我正在使用string.Replace("'","''")使用动态SQL查询。像这样:

SqlCommand

cmd.CommandText = "SELECT * FROM myTable WHERE ID = " + theID.ToString();

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

1 个答案:

答案 0 :(得分:9)

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

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

自己手动转义引号容易出错,有时可能会以提前难以预料的方式失败。例如,使用下表

CREATE TABLE myTable(title VARCHAR(100))
INSERT INTO myTable VALUES('Foo')

使用使用字符串连接构建的动态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)

您可以尝试以下

正常更新

EXEC UpdateMyTable N'Foo'
SELECT * FROM myTable /*Returns "Foo"*/

SQL注入尝试失败

EXEC UpdateMyTable N''';DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "';DROP TABLE myTable--"*/

SQL注入尝试成功并删除表

EXEC UpdateMyTable N'ʼ;DROP TABLE myTable--'
SELECT * FROM myTable  /*Returns "Invalid object name 'myTable'."*/

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

在我阅读the answer here之前,我永远不会想到这个问题。