参数化字符串以及LIKE和通配符运算符

时间:2012-10-30 18:52:20

标签: c# sql wildcard sql-like code-injection

我在搜索中看到SQL查询中参数化字符串的使用形式如下:

SqlCommand comm = new SqlCommand();
comm.CommandText="SELECT * FROM table WHERE field LIKE '%'+@var+'%'";
comm.Parameters.AddWithValue("var","variabletext");
SqlDataReader reader = comm.ExecuteReader();

但是,在这个论坛中提到它尽管在参数化字符串中被使用,但仍然受到sql注入。我只能假设连接的字符串绕过所有参数化的安全性,只是将值直接作为字符串插入。如果是这种情况,如何在参数化查询中使用通配符运算符,同时避免sql代码注入?

2 个答案:

答案 0 :(得分:3)

容易受到SQL注入攻击。

谁告诉你这是错的。 '%'+@var+'%'被视为数据而不是可执行代码。它被评估为一个字符串,然后用作LIKE右侧的模式。

如果您当时EXEC这种连接的结果,那么您只会遇到问题。简单地在查询本身中执行字符串连接不是问题。

答案 1 :(得分:2)

您应该使用"SqlParameter"将值发送到存储过程进行搜索。 "SqlParameter"的目的是拒绝值中的所有注入事物。此外,如果您必须执行包含sql代码的文本或连接参数,则应再次将命令的"CommandType"属性设置为"Text",并使用"SqlParameter"将值发送给文本。

在此处查看Microsoft文档:

http://msdn.microsoft.com/en-us/library/ff648339.aspx

还有关于stackoverflow的另一个问题:

How does SQLParameter prevent SQL Injection?

另请参阅此处查看一些具体示例:

Examples of SQL injection even when using SQLParameter in .NET?

更新

由于您已经更新了问题,现在确切地指定了执行方式,因此您提到的代码中不再存在SQL注入问题。

干杯