这是否容易受到注射攻击
本文关键字:攻击 易受 是否 | 更新日期: 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 语句。应验证所有内容并将它们作为参数添加到数据库中。