我有一些代码利用参数化查询来防止注入,但我还需要能够动态构造查询,而不管表的结构如何.这样做的正确方法是什么?
这是一个例子,说我有一个表名列,地址,电话.我有一个网页,我在其中运行显示列并使用它们作为选项填充选择下拉列表.
接下来,我有一个名为Search的文本框.此文本框用作参数.
目前我的代码看起来像这样:
result = pquery('SELECT * FROM contacts WHERE `' + escape(column) + '`=?', search);
不过,我从中得到了一种icky的感觉.我使用参数化查询的原因是为了避免使用转义.此外,转义可能不是为逃避列名而设计的.
我怎样才能确保这个按照我的意图运作?
编辑: 我需要动态查询的原因是架构是用户可配置的,我不会修复任何硬编码的东西.
不要传递列名,只需使用硬编码表传递代码将转换为列名的标识符.这意味着您无需担心传递恶意数据,因为所有数据都是合法翻译的,或者已知无效.Psudoish代码:
@columns = qw/Name Address Telephone/; if ($columns[$param]) { $query = "select * from contacts where $columns[$param] = ?"; } else { die "Invalid column!"; } run_sql($query, $search);