4

我在搜索中看到在 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 代码注入?

4

2 回答 2

3

容易受到 SQL 注入的影响。

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

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

于 2012-10-30T18:59:59.687 回答
2

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

在此处查看有关此内容的 Microsoft 文档:

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

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

SQLParameter 如何防止 SQL 注入?

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

即使在 .NET 中使用 SQLParameter 的 SQL 注入示例?

更新:

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

干杯

于 2012-10-30T18:58:02.593 回答