C# 我团队的一位高级开发人员告诉我,编写这样的SQL命令是安全的;因为它';s参数化的";,但我不知道';我不知道怎么做

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注入,因为它是“参数化的” 根据,您问题中的代码完全有效,并将正确参数化:

我正在为与某些产品相关的媒体编写一些CRUD函数。要删除许多记录,我被告知按如下方式编写查询:

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的产品;更新灵敏度记录设置密码=”