我只是想知道,如果我每更换'用''的用户输入,例如string.Replace("'","''")和验证号码(确保它们是数字,不包含任何其他字符),是SQL注入仍然是可能的?如何?
'
''
string.Replace("'","''")
我正在使用动态SQL查询SqlCommand。像这样的东西:
SqlCommand
cmd.CommandText = "SELECT * FROM myTable WHERE ID = " + theID.ToString();
或者
cmd.CommandText = "UPDATE myTable SET title='" + title.Replace("'","''") + "' WHERE ID = " + theID.ToString();
输入整数将在ASP.NET MVC中自动验证(检查它们是否为实数)。
如果这是一个用这种方式编码的遗留项目,那么虽然不是最佳方案,但我目前还不知道它会受到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)发生卫生情况后将字符串分配给a ,从而将其默默地转换为常规的撇号。
varchar(max)