sql-injection - 参数化的 SQL 列?

标签 sql-injection parameterized

我有一些代码利用参数化查询来防止注入(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/

相关文章:

php - 创建盲SQL注入(inject)漏洞

c# - SQL 脚本数据中的关键字在以编程方式执行时导致问题 - C#

java - 使用 JTOpen 连接到 AS/400 时存在 SQL 注入(inject)风险

python - 使用 tensorflow 对输出函数进行参数化模型

c# - 带 % 的参数化查询

java - 使用 JOOQ 通过用户输入安全地设置 MySQL 变量

mysql - 这个 MySQL 存储过程是否容易受到 SQL 注入(inject)攻击?

java - 泛型类类型中的参数化方法

PHP:准备好的语句,IF 语句需要帮助

asp.net - SqlParameterCollection 只接受非空 SqlParameter 类型对象,而不接受 String 对象