我正在使用EF Core的项目中工作;在一种特定情况下,我必须使用原始SQLite命令更新实体的身份。
构建SqlCommand并执行由于某种原因而无法执行的操作,以及直接将参数传递给ExecuteSqlCommand()
,它总是会引发异常(我想这是当前Sqlite驱动程序中的错误)。
但是,从理论上讲,以下代码不应
string commandText = $"UPDATE {table} SET Id={idPair.Value} WHERE Id={idPair.Key};";
已经阻止了SQL注入,因为这里
table
是我直接从DbContext模型获得的表名idPair
保证是 KeyValuePair<int, int>
?
我主要是问,因为我不知道该抑制该特定警告,还是尝试以其他方式进行处理(无论如何,在EntityFrameworkCore.Sqlite上打开错误报告)。
只要所讨论的类型不能在结果SQL中转换为有害的内容,就可以。只要记住,这很容易,一年后得出这样的代码,而没有意识到有字面上对SQL注入没有保护,并错误地添加的东西,可以是危险的。也许有人决定将您所有的键都更改为字符串。关键是没有什么可以帮助您识别潜在的问题-没有编译器错误,没有运行时错误,一切都会像以前一样工作,直到有人滥用漏洞为止。就是说,尽管您可以依赖于一个int
永远不会包含任意string
值的类型系统,但并不能保证一年后idPair
仍会存在KeyValuePair<int, int>
。
另外,我永远不会说做坏事是绝对不可能的。到目前为止,这种权衡通常偏向于参数化查询,因此没有理由不使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句