将已清理的输入作为where子句中的列名称传递

时间:2014-11-27 06:40:50

标签: php mysql pdo

我有一个接受$filter参数的函数,然后根据参数中的过滤器从SQL表中提取数据。起初我尝试重载函数,以便一个函数接受一个$filter变量,另一个函数接受一个数组用于多个过滤器。但后来,我开始想知道如何清理过滤器标签。

这可能令人困惑,所以这里有一些例子。例如,用户在搜索框中键入以显示名称为 John 的所有用户。因此,$filter_tag会设置为“' name'而$filter将会说约翰'。我的PDO查询看起来像这样:

$query = "SELECT `name` FROM `users` WHERE ";
$query .= $filter_tag." = ?";

问题是$filter_tag未经过清理。如果我对它进行清理并且变量被转义,则查询将不起作用。也许我让它变得比它需要的更复杂,并且有一些简单的解决方案。

如果您不理解我要问的内容,请发表评论。

1 个答案:

答案 0 :(得分:6)

您可以创建有效标记的白名单:

if (in_array($filter_tag, ['name', ...], true)) {
    $query .= $filter_tag . = '?';
}

或者你可以删除所有无效字符,但我更喜欢白名单方法,因为只有那么多有效的列名:)

最后,如果给定的标记没有出现在白名单中,您也可以转动条件而不是上面的代码,并引发错误。在某些情况下,这可能是更好的方法,因为否则您可能会在以后收到错误,因为传递给->execute()的参数数量应与查询中的占位符数量相匹配。