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

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

我只是想知道,如果我在用户输入中替换每个' with '' ,例如string.Replace("'","''") ,并validation数字(确保它们是数字,并且不包含任何数字其他角色),SQL注入仍然可能吗? 怎么样?

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

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

要么

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

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

如果这是一个以这种方式编码的遗留项目,那么虽然不是最优的,但我目前还没有意识到它可以容易受到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) ,然后静默地将其转换为常规撇号。

直到我在这里读到答案,这个问题永远不会发生在我身上。