c# - 带有替换单引号和验证整数的 SQL 注入(inject)

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

<分区>

Possible Duplicate:
Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?

我只想知道,如果我将用户输入中的每个 ' 替换为 '',例如 string.Replace("'","' '"),并验证数字(确保它们是数字,并且不包含任何其他字符),SQL 注入(inject)是否仍然可能?怎么办?

我正在使用动态 SQL 查询,使用 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 注入(inject)的影响,只要每个字符串都以这种方式处理并且查询正如您所展示的那样只是简单的。

然而,我不能说比这更确定的了。如果不使用参数化查询,则始终可能存在您尚未考虑的一些漏洞。

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

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 注入(inject)尝试被挫败

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

SQL 注入(inject)尝试成功并删除了表

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

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

直到我读到 the answer here我永远不会想到这个问题。

关于c# - 带有替换单引号和验证整数的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235262/

相关文章:

sql - SQLServer 中 Float 的 Len 函数给出了错误的长度

asp.net - 未提供的参数化查询

mysql - SQL:多次重复结果行,并对行编号

c# - 如何使用 Entity Framework Code First 将 C# int 映射到 SqlServer tinyint?

C# 8 - 多重继承 "abstract class"?

c# - 无法从 Task<> 隐式转换类型

php - 在 Woocommerce 中之前按 _sale_price_dates_to 获取产品 ID

c# - 修改类的属性

java - jsp中的request.getParameter返回null或空字符串

mysql - 选择分组值和值的总和