在我的 SQL 查询中,我从用户填写的表单中提交数据,如此处所示,无法使用 PDO 参数化我的列名。这很重要,因为查询中的列名是根据表单中的字段名动态插入的。
我可以很容易地验证 $_POST 数组中提交的列名,只需将它们从数据库中拉出并丢弃任何不匹配的列名。这是避免 SQL 注入的好事还是只是浪费系统资源(因为它有效地使依赖于数据库的任何请求的执行加倍)?
3 回答
除了对列列表进行硬编码之外,您还可以通过数据库中的另一个表构建列列表,您希望允许从中查询列,例如
QuerableSources
SrcTable SrcColumn DescriptToUser
SomeTable SomeColumn Column used for
AnotherTable AnotherColumn Something Else
etc.
然后,例如为用户构建一个组合框以选择“DescriptionToUser”内容以便于阅读,并控制有效的列和表源。
至于他们正在寻找的价值,一定要擦洗/清理它以防止 SQL 注入。
这是避免 SQL 注入的好方法吗
不。
或者只是浪费系统资源
不。
它不能浪费,因为它只是系统表中的一个简单选择。
但是当用户不允许进入某些字段时,它仍然可以是某种注入。比如说,如果站点管理员填写了一个(虚构的)字段“user_role”,并且用户可以在 POST 中定义它,他们可以更改他们的访问权限。
因此,硬编码(白名单)允许的字段是唯一可靠的方法。
因为它有效地使依赖于数据库的任何请求的执行加倍
男人。打算查询的数据库。这是他们唯一的目的。不能支持简单选择查询的数据库是无稽之谈。查询不同。插入一个比 10 个选择要重得多。您必须按质量而不是数量来区分查询。
查询中的列名是根据表单中的字段名动态插入的。
虽然对于插入/更新查询来说这是非常正确的,但对于 SELECT 查询来说,这是糟糕设计的一个重要标志。我可以在 WHERE/ORDER BY 子句中使用变量字段名称,但是如果您必须在表名称子句的字段集中进行操作 - 您的数据库设计肯定是错误的。
您可以对列名进行硬编码以使其更快。您还可以缓存拉取的表描述,这样您就不需要在每次表架构更改时更新代码。