什么时候在SQL命令中使用非参数化变量是安全的?

ehd*_*hdv 4 c# sql database

我正在用C#方法编写一个select查询,它允许客户端代码提供行ID并返回从行数据构造的对象.如果行ID是一个整数并且我已经确认它是正数,那么通过使用string.Format传递它是否有任何危害?如果只允许传入int而不是字符串,我看不出有什么损坏可以做.

dri*_*iis 12

你是对的,以这种方式传递整数是安全的.然而,故事的另一面也是如此.

虽然可以认为只是格式化一个int来创建SQL表达式是安全的,但也有一个性能考虑因素.当SQL Server第一次看到查询时,它将创建并缓存该查询的执行计划.下次发出相同的查询时,将重用执行计划.

如果传入不同的字符串,它将被视为单独的查询,需要单独的执行计划.如果每次传入相同的参数化查询(具有不同的参数),SQL Server将重用第一个执行计划.

即使您不关心性能优势,我仍然会对所有针对数据库的查询使用参数化查询,即使对于那些可以被视为"安全"的查询 - 只需要与应用程序的方式保持一致访问数据.如果您始终使用参数化查询,则还可以省去每次确定查询是否安全的麻烦,以便决定查询数据库的方式.

  • +1 - 正确参数化查询后的性能优势意味着永远不会对它们进行参数化没有多大意义.参数化不仅适用于SQL注入预防. (2认同)