我正在用C#方法编写一个select查询,它允许客户端代码提供行ID并返回从行数据构造的对象。如果行ID是一个整数并且我已经确认它是正数,那么通过使用string.Format传递它是否有任何危害?如果只允许传入int而不是字符串,我不会看到如何造成任何损害。
答案 0 :(得分:12)
你是对的,以这种方式传递整数是安全的。然而,故事还有另一面。
虽然可以认为只是格式化一个int来创建SQL表达式是安全的,但还有一个性能考虑因素。当SQL Server第一次看到查询时,它将创建并缓存该查询的执行计划。下次发出相同的查询时,将重用执行计划。
如果传入不同的字符串,它将被视为单独的查询,需要单独的执行计划。如果每次传入相同的参数化查询(使用不同的参数),SQL Server将重用第一个执行计划。
即使您不关心性能优势,我仍然会对数据库的所有查询使用参数化查询,即使对于那些可以被视为“安全”的查询 - 只需要在应用程序访问数据的方式。如果总是使用参数化查询,它还可以省去每次确定查询是否安全的麻烦,以便决定查询数据库的方式。
答案 1 :(得分:1)
你在这里回答你自己的问题。 System.Int32不能包含
';DROP DATABASE xxx;--
如果这就是你担心的事情。即使传递负整数也不会对数据库产生负面影响!