2012-04-11 113 views
0

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

我可以非常容易地验证$ _POST数组中提交的列名,方法是将它们从数据库中拉出来,然后抛出任何不匹配的列名。这对于避免SQL注入是一件好事,或者仅仅是浪费系统资源(因为它有效地将依赖于数据库的任何请求的执行加倍)?提交SQL查询时是否需要验证列名?

回答

1

这是一个很好的事情,以避免SQL注入

或仅仅是系统资源的浪费

它不是一个浪费,因为它只是一个简单的选择从sys技术表。

但是,当用户不被允许进入某些领域时,它仍然可以是某种注射。假设,如果网站管理员填写了一个(虚拟)字段“user_role”,并且用户可以在POST中定义它,他们可以改变他们的访问权限。

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

,因为它有效地加倍依赖于数据库

男人的任何请求的执行。数据库打算被查询。这是他们唯一的目的。无法维持简单的选择查询的数据库是无稽之谈。查询是不同的。插入一个比10个选择更重。您必须按质量区分查询,而不是数量。

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

尽管对于插入/更新查询来说,这是非常正确的,对于SELECT来说,它是坏设计的大标志。我可以在WHERE/ORDER BY子句中使用可变字段名称,但是如果您必须在表名称子句的字段集中运行,那么您的数据库设计肯定是错误的。

+0

大概应该已经更清楚了,我的SELECT查询不使用动态字段名称。正如你所说,那将是愚蠢的。 – hamalnamal 2012-04-12 18:02:17

0

您可以对列名进行硬编码以使其更快。您还可以缓存所拉取的表格描述,以便每次更改表格模式时都不需要更新代码。

1

除了硬编码列的列表,你可以通过你要允许从列查询数据库中的另一个表建立的列清单,如

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

然后,你建立例如为用户选择“DescriptionToUser”内容以便于阅读的组合框,并且您控制有效的列和表格源。

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