C# 我团队的一位高级开发人员告诉我,编写这样的SQL命令是安全的;因为它';s参数化的";,但我不知道';我不知道怎么做
我正在为与某些产品相关的媒体编写一些CRUD函数。要删除许多记录,我被告知按如下方式编写查询:C# 我团队的一位高级开发人员告诉我,编写这样的SQL命令是安全的;因为它';s参数化的";,但我不知道';我不知道怎么做,c#,sql,linq,sql-injection,C#,Sql,Linq,Sql Injection,我正在为与某些产品相关的媒体编写一些CRUD函数。要删除许多记录,我被告知按如下方式编写查询: dataContext.ExecuteCommand("DELETE FROM ProductMedia WHERE ProductId = {0}", productId); 他说,这是安全的SQL注入,因为它是“参数化的”。我不同意,但我也不知道更好的方法 以这种方式编写命令时,如何防止SQL注入 他说,这是安全的SQL注入,因为它是“参数化的” 根据,您问题中的代码完全有效,并将正确参数化:
dataContext.ExecuteCommand("DELETE FROM ProductMedia WHERE ProductId = {0}", productId);
他说,这是安全的SQL注入,因为它是“参数化的”。我不同意,但我也不知道更好的方法
以这种方式编写命令时,如何防止SQL注入
他说,这是安全的SQL注入,因为它是“参数化的”
根据,您问题中的代码完全有效,并将正确参数化:
该命令的语法与用于
创建ADO.NET DATA命令。唯一的区别在于
参数是指定的。具体来说,可以通过以下方式指定参数:
将它们括在大括号({…})中,并从0开始枚举它们。这个
参数与中编号相等的对象相关联
参数数组
它本质上是一个包装器,负责创建必要的SqlParameter
对象并为其赋值。其他orm(如PetaPoco)也有类似的机制
通常,您要避免的是字符串串联(或有效串联的东西,如
string.Format
)——此解决方案不使用。字符串连接几乎总是对SQL注入开放的。但是,同样,您问题中的代码很好。您是否阅读了执行命令的文档?你为什么不同意?你能给我解释一下参数化查询是如何容易被注入的吗?ExecuteCommand(“从ProductMedia中删除,其中ProductId={0}”,ProductId)
是参数化和安全的ExecuteCommand(string.Format(“从ProductMedia中删除,其中ProductId={0}”,ProductId))
不是。我现在已经阅读了文档,谢谢。我只是想你可能可以传递一些东西,比如“1或1=1;更新灵敏度记录设置密码=”
@Yahtzei,你可以传递它。它将删除Id等于“1或1=1的产品;更新灵敏度记录设置密码=”
。