php - 提交SQL查询时是否需要验证列名?

标签 php mysql pdo sql-injection

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

我可以很容易地验证 $_POST 数组中提交的列名,只需将它们从数据库并丢弃任何不匹配的内容。这是避免 SQL 注入(inject)的一件好事,还是只是浪费系统资源(因为它实际上使依赖数据库的任何请求的执行量加倍)?

最佳答案

Is this a good thing to do to avoid SQL injection

没有。

or is simply a waste of system resources

没有。

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

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

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

as it effectively doubles the execution of any request that relies on the Database

伙计。用于查询的数据库。这是他们唯一的目的。无法支持简单选择查询的数据库是无稽之谈。查询不同。一个插入比 10 个选择要重得多。您必须根据质量而不是数量来区分查询。

the column names in the query are inserted dynamically based on the field names in the form.

虽然对于插入/更新查询来说确实如此,但对于 SELECT 查询来说,这是糟糕设计的一个重要标志。我可以在 WHERE/ORDER BY 子句中接受变量字段名称,但如果您必须在表名称子句的字段集中使用 vem,那么您的数据库设计肯定是错误的。

关于php - 提交SQL查询时是否需要验证列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114949/

相关文章:

php - 循环遍历 json 数组并按键值分组

PHP 登录后重定向到所选页面

mysql - 在 MySQL 中启用 InnoDB

MySQL 使用 WHERE 子句平均分布随机行

java - java中mysql中的一句话出现问题

php - PDO 会知道 mysql 是否崩溃了吗?

php - 计算字符串中某个字符串出现的次数

php - 奇怪的 PHP 和 Codeigniter

php 在执行后回显查询的实际语句

PHP PDO - 动态绑定(bind)变量数