我有一些代码利用参数化查询来防止注入(inject),但我还需要能够动态构造查询,而不管表的结构如何。这样做的正确方法是什么?
这是一个示例,假设我有一个包含名称、地址、电话列的表。我有一个网页,我在其中运行 Show Columns 并使用它们作为选项填充选择下拉列表。
接下来,我有一个名为 Search 的文本框。此文本框用作参数。
目前我的代码看起来像这样:
result = pquery('SELECT * FROM contacts WHERE `' + escape(column) + '`=?', search);
不过,我从中得到一种恶心的感觉。我使用参数化查询的原因是避免使用转义。此外,转义可能不是为转义列名而设计的。
我怎样才能确保这按我的意图工作?
编辑:
我需要动态查询的原因是模式是用户可配置的,我不会去修复任何硬编码的东西。
最佳答案
无需传递列名,只需传递您编码的标识符,该标识符将使用硬编码表转换为列名。这意味着您无需担心会传递恶意数据,因为所有数据要么经过合法翻译,要么已知无效。伪代码:
@columns = qw/Name Address Telephone/;
if ($columns[$param]) {
$query = "select * from contacts where $columns[$param] = ?";
} else {
die "Invalid column!";
}
run_sql($query, $search);
关于sql-injection - 参数化的 SQL 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/106001/