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

C# 使用替换单引号和验证整数的SQL注入,c#,sql,sql-server,sql-server-2005,sql-injection,C#,Sql,Sql Server,Sql Server 2005,Sql Injection,可能重复: 我只是想知道,如果我用用户输入中的字符串替换“every”,例如string.replace“,”和validate number,确保它们是数字,并且不包含任何其他字符,那么SQL注入仍然可行吗?怎么做 我使用动态SQL查询,使用SqlCommand。大概是这样的: cmd.CommandText = "SELECT * FROM myTable WHERE ID = " + theID.ToString(); 或 在ASP.NET MVC中,输入整数会被自动验证并检查它们是否

可能重复:

我只是想知道,如果我用用户输入中的字符串替换“every”,例如string.replace“,”和validate number,确保它们是数字,并且不包含任何其他字符,那么SQL注入仍然可行吗?怎么做

我使用动态SQL查询,使用SqlCommand。大概是这样的:

cmd.CommandText = "SELECT * FROM myTable 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'."*/
这里的问题是,第三个查询传递而不是标准的撇号,然后字符串被分配给一个varcharmax,在这个过程发生后,它会默默地将其转换为一个常规的撇号


在我读到这篇文章之前,我永远不会想到这个问题

如果这是一个以这种方式编码的遗留项目,那么,虽然不是最优的,但我目前还不知道它可能会受到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'."*/
这里的问题是,第三个查询传递而不是标准的撇号,然后字符串被分配给一个varcharmax,在这个过程发生后,它会默默地将其转换为一个常规的撇号


在我读到这篇文章之前,我永远不会想到这个问题

帮你自己和你的数据库服务器一个忙:使用参数化查询……你对使用参数化查询或其他建议的经验证的方法来避免SQL注入有什么哲学或宗教上的反对意见吗?如果我想创建一个新项目,我应该使用参数化查询。但在这种情况下,有一个现有的程序,它执行我在问题中所说的防止注射的措施。更改所有查询需要很多时间。我只是想知道这种方法的安全性是否足够。。。为什么是-1@马赫迪我们能给出的唯一安全的答案是不,它们还不够。在black hat网站上有现成的邪恶SQL脚本,用于绕过验证,例如报价加倍。坦率地说,这是不值得冒险的,尤其是在参数化如此容易的情况下。帮你自己和你的DB服务器一个忙:使用参数化查询…你对使用参数化查询或其他建议的经验证的方法来避免SQL注入有什么哲学或宗教上的反对吗?如果我想创建一个新项目,我应该使用参数化查询。但在这种情况下,有一个现有的程序,它执行我在问题中所说的防止注射的措施。更改所有查询需要很多时间。我只是想知道这种方法的安全性是否足够。。。为什么是-1@马赫迪我们能给出的唯一安全的答案是不,它们还不够。在black hat网站上有现成的邪恶SQL脚本,用于绕过验证,例如报价加倍。坦白地说,这是不值得冒险的,特别是当它很容易参数化的时候。你的最后一个U+02BC就是一个很好的例子,谢谢。你的最后一个U+02BC就是一个很好的例子,谢谢。