是否有必要在提交SQL查询时验证列名?

时间:2012-04-11 22:35:32

标签: php mysql pdo sql-injection

在我的SQL查询中,我从用户填写的表单中提交数据,如图here所示,无法使用PDO参数化我的列名。这很重要,因为查询中的列名是根据表单中的字段名称动态插入的。

我可以通过简单地将它们拉出来轻松验证$ _POST数组中提交的列名。数据库并丢弃任何不匹配的数据库。这是避免SQL注入或仅仅浪费系统资源(因为它有效地使依赖于数据库的任何请求的执行速度加倍)这是一件好事吗?

3 个答案:

答案 0 :(得分:1)

除了对列列表进行硬编码之外,您还可以通过数据库中要允许列查询的另一个表来构建列列表,例如

QuerableSources
SrcTable      SrcColumn      DescriptToUser
SomeTable     SomeColumn     Column used for
AnotherTable  AnotherColumn  Something Else
etc.

然后,您构建一个组合框,供用户选择“DescriptionToUser”内容以便于阅读,并且您可以控制有效的列和表源。

至于他们正在搜索的VALUE,请务必清理/清理它以防止SQL注入。

答案 1 :(得分:1)

  

这是避免SQL注入的好事吗

没有

  

或者只是浪费系统资源

没有

这不是一种浪费,因为它只是从系统表中进行简单的选择。

但是当不允许用户访问某些字段时,它仍然可以是某种注入。比如,如果网站管理员填写了一个(虚构的)字段“user_role”,并且用户可以在POST中定义它,则可以更改其访问权限。

因此,硬编码(白名单)允许字段是唯一可靠的方法。

  

因为它有效地使依赖于数据库的任何请求的执行倍增

曼。要查询的数据库。这是他们唯一的目的。无法维持简单选择查询的数据库是无稽之谈。查询是不同的。插入一个比十个选择更重。您必须按质量区分查询,而不是数量。

  

根据表单中的字段名称动态插入查询中的列名。

虽然对于插入/更新查询是完全正确的,但对于SELECT,它是糟糕设计的一个大标志。我可以在WHERE / ORDER BY子句中使用变量字段名称,但如果您必须在表名子句的字段集中使用 - 您的数据库设计肯定是错误的。

答案 2 :(得分:0)

您可以对列名进行硬编码以使其更快。您还可以缓存提取的表描述,这样您就不需要在每次表模式更改时更新代码。