我在搜索中看到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代码注入?
答案 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注入问题。
干杯