这是否容易受到注射攻击

时间:2014-12-09 22:39:36

标签: c# sql-server

以下c#代码段是否容易受到SQL注入攻击?

string sql = @"
    declare @sql navarchar(200)
    set @sql = 'select * from customers where customerId = ' + convert(navarchar, @custId)
    exec sp_sqlexec @sql
"

oSQL.Parameters.Add("custId", CustomerId);
DataTable dt = oSQL.ExecuteDataTable(sql);

我理解这是一个简单的sql语句,但我对使用exec sp_sqlexec的方法更感兴趣。 sql语句比声明的语句更动态,但不认为它对我的问题很重要。

2 个答案:

答案 0 :(得分:3)

稍微更安全的解决方案是将动态查询参数化:

(请注意,您也应该使用sp_executesql

string sql = @"
    declare @sql navarchar(200)
    set @sql = 'select * from customers where customerId = @customerId'
    exec sp_sqlexecuseSQL @sql, N'@customerId INT`, @customerId = @custId
"

oSQL.Parameters.Add("custId", CustomerId);
DataTable dt = oSQL.ExecuteDataTable(sql);

答案 1 :(得分:2)

根据SO的评论更新答案。动态SQL(或实际上任何SQL语句,这是一个很好的规则)通常,如果它们可能是用户输入,则通常对SQL注入开放。如果所有使得SQL语句的参数都来自另一个数据库或者说下拉列表等,那么不能用SQL注入成功。

要记住的一般规则:不要让未经验证的数据进入SQL语句。应验证所有内容并将其作为参数添加到数据库中。