这是否容易受到注射攻击

本文关键字:攻击 易受 是否 | 更新日期: 2023-09-27 18:33:42

以下 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 语句比声明的更动态,但不要认为它对我的问题很重要。

这是否容易受到注射攻击

一个稍微安全一点的解决方案是使dynaimc查询也参数化:

(请注意,您还应该使用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);

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

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