Php 在where子句中将经过消毒的输入作为列名传递

Php 在where子句中将经过消毒的输入作为列名传递,php,mysql,pdo,Php,Mysql,Pdo,我有一个函数,它接受$filter参数,然后根据参数中的过滤器从SQL表中提取数据。起初,我尝试重载该函数,以便一个函数接受单个$filter变量,另一个函数接受多个过滤器的数组。但后来,我开始想我怎样才能消毒过滤器标签 这可能会让人困惑,所以这里有一些例子。例如,用户在搜索框中键入以显示名为John的所有用户。因此,$filter\u tag将设置为“name”,而$filter将设置为“John”。我的PDO查询如下所示: $query = "SELECT `name` FROM `user

我有一个函数,它接受
$filter
参数,然后根据参数中的过滤器从SQL表中提取数据。起初,我尝试重载该函数,以便一个函数接受单个
$filter
变量,另一个函数接受多个过滤器的数组。但后来,我开始想我怎样才能消毒过滤器标签

这可能会让人困惑,所以这里有一些例子。例如,用户在搜索框中键入以显示名为John的所有用户。因此,
$filter\u tag
将设置为“name”,而
$filter
将设置为“John”。我的PDO查询如下所示:

$query = "SELECT `name` FROM `users` WHERE ";
$query .= $filter_tag." = ?";
问题是,
$filter\u标签
没有消毒。如果我对它进行了清理,并且变量被转义,那么查询将无法工作。也许我把事情弄得比实际需要的更复杂了,有一些简单的解决办法


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

您可以创建一个有效标签的白名单:

if (in_array($filter_tag, ['name', ...], true)) {
    $query .= $filter_tag . = '?';
}
或者,您可以删除所有无效字符,但我更喜欢白名单方法,因为只有那么多有效的列名:)


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

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

if (in_array($filter_tag, ['name', ...], true)) {
    $query .= $filter_tag . = '?';
}
或者,您可以删除所有无效字符,但我更喜欢白名单方法,因为只有那么多有效的列名:)


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

完美,正是我要找的。完美,正是我要找的。