我有一个接受$filter
参数的函数,然后根据参数中的过滤器从SQL表中提取数据。起初我尝试重载函数,以便一个函数接受一个$filter
变量,另一个函数接受一个数组用于多个过滤器。但后来,我开始想知道如何清理过滤器标签。
这可能令人困惑,所以这里有一些例子。例如,用户在搜索框中键入以显示名称为 John 的所有用户。因此,$filter_tag
会设置为“' name'而$filter
将会说约翰'。我的PDO查询看起来像这样:
$query = "SELECT `name` FROM `users` WHERE ";
$query .= $filter_tag." = ?";
问题是$filter_tag
未经过清理。如果我对它进行清理并且变量被转义,则查询将不起作用。也许我让它变得比它需要的更复杂,并且有一些简单的解决方案。
如果您不理解我要问的内容,请发表评论。
答案 0 :(得分:6)
您可以创建有效标记的白名单:
if (in_array($filter_tag, ['name', ...], true)) {
$query .= $filter_tag . = '?';
}
或者你可以删除所有无效字符,但我更喜欢白名单方法,因为只有那么多有效的列名:)
最后,如果给定的标记没有出现在白名单中,您也可以转动条件而不是上面的代码,并引发错误。在某些情况下,这可能是更好的方法,因为否则您可能会在以后收到错误,因为传递给->execute()
的参数数量应与查询中的占位符数量相匹配。