参数化SQL列?

Mar*_*tin 8 sql-injection parameterized

我有一些代码利用参数化查询来防止注入,但我还需要能够动态构造查询,而不管表的结构如何.这样做的正确方法是什么?

这是一个例子,说我有一个表名列,地址,电话.我有一个网页,我在其中运行显示列并使用它们作为选项填充选择下拉列表.

接下来,我有一个名为Search的文本框.此文本框用作参数.

目前我的代码看起来像这样:

result = pquery('SELECT * FROM contacts WHERE `' + escape(column) + '`=?', search);

不过,我从中得到了一种icky的感觉.我使用参数化查询的原因是为了避免使用转义.此外,转义可能不是为逃避列名而设计的.

我怎样才能确保这个按照我的意图运作?

编辑: 我需要动态查询的原因是架构是用户可配置的,我不会修复任何硬编码的东西.

zig*_*don 6

不要传递列名,只需使用硬编码表传递代码将转换为列名的标识符.这意味着您无需担心传递恶意数据,因为所有数据都是合法翻译的,或者已知无效.Psudoish代码:

@columns = qw/Name Address Telephone/;
if ($columns[$param]) {
  $query = "select * from contacts where $columns[$param] = ?";
} else {
  die "Invalid column!";
}

run_sql($query, $search);
Run Code Online (Sandbox Code Playgroud)