【发布时间】:2013-01-16 21:01:59
【问题描述】:
小背景:我是这家公司唯一的程序员。我正在使用预先存在的框架。
也就是说,该公司有一个 dll(Database.dll),其中包含“我需要的所有数据库交互”。例如,它有一个Query()、Update()、Insert() 等。现在,我正在编写的项目设置了对 Database.dll 的引用。我的项目接受零用户输入。最接近用户输入的是一个下拉框,用户可以从中选择一个日期。没有太多经验,我很好奇我是否还需要担心 SQL 注入?如果是这样,查询会写成这样
var query = string.Format("SELECT timestamp FROM table1 WHERE date = \"{0}\"
AND measured_dist = bit_loc AND rop > 0" , Date))
作为参数化查询就足够了吗?请记住,所有查询执行都由预先存在的Query() 处理,我被告知我必须使用它,并且无法编辑。
编辑
这个程序是一个 WinForm 应用程序。
【问题讨论】:
-
正确答案是“总是”。
-
除非你在做一些不能参数化的事情,否则就让它参数化。抛开安全性不谈,您可能会获得性能提升:参数化将为您的 RDBMS 节省参数化查询本身以使其与执行计划相匹配的工作。客户端之一,您不需要分配/格式化大量字符串,代码更整洁等等。
-
只要用户不能输入成为查询一部分的文本,那么您应该没问题。但是您在上面所做的不是“参数化查询”,而是一个 string.Format() 调用,并且不会为您提供任何防止注入的保护。例如,如果“日期”变量包含值:“12/12/12\”;DELETE * FROM table1;\“SELECT timestamp FROM table1 WHERE 1=1”;你会有麻烦的。
-
关于现有的 Query 方法:谁说你“必须使用,不能编辑”不是做出技术决策的好人:每一个部分都是错误的。如果有帮助,我可以建议一些方法来轻松更改参数。
-
“Database.dll”听起来像是一场等待发生的灾难。只是好奇,是什么阻止了某人在他们自己的应用程序中使用它来清除您的数据库。例如,一个不开心的员工通常可能不会获得数据库访问权限?