【问题标题】:PHP - How to check if an input filter is valid?PHP - 如何检查输入过滤器是否有效?
【发布时间】:2019-05-10 15:36:29
【问题描述】:

我有一个函数,它将filter_input 的过滤器常量作为可选参数。是否有可能确保字符串的值是一个有效的 PHP 过滤器常量,也许使用内置的 PHP 函数?

我知道一种方法是制作我自己的所有过滤器常量数组并对其进行检查,但我希望有一种更简单或更好的方法。

【问题讨论】:

标签: php constants sanitization filter-input


【解决方案1】:

您可以根据过滤器列表进行验证:

$valid = in_array($filter, filter_list(), true);

其中$filter 包含用户提供的过滤器值,$valid 将结果作为布尔值(true 如果有效,false 如果无效)。

更多详情请参阅 PHP 手册中的filter_list()

【讨论】:

  • 谢谢,我认为这会很好。 filter_list() 很高兴知道并没有出现在我的谷歌搜索中。
  • @track:不客气。在谷歌搜索旁边,我发现通常值得浏览和阅读 PHP 手册中的相关部分,例如扩展的功能列表。这就是我发现这个的方式。还有另一种方法是使用反射从 PHP 扩展中获取所有常量:php.net/manual/en/reflectionextension.getconstants.php - 它适用于每个扩展,但与filter_list() 相比,它并不适合您的情况。
【解决方案2】:

我能够通过使用 get_defined_constants() PHP 内置函数来实现这一点,该函数列出了所有预定义的 PHP 常量。

解决方案:

下面的代码会将所有允许的过滤器存储到一个数组中,并允许您通过 check_filter() 函数检查任何过滤器的有效性。

<?php

$constants = get_defined_constants();
$allowed_filters = array();
foreach ($constants as $c => $val)
    if (substr($c, 0, 7) == 'FILTER_')
        $allowed_filters[$c] = 1;

function check_filter($filter_name, $allowed_filters) { return isset($allowed_filters[$filter_name]); }

var_dump(check_filter('FILTER_SANITIZE_EMAIL', $allowed_filters)); // true
var_dump(check_filter('FILTER_TEST', $allowed_filters)); // false
var_dump(check_filter('PHP_VERSION', $allowed_filters)); // false, even though constant exists

我希望这会有所帮助!

【讨论】:

  • 白名单可能更精确,只需查找 FILTER_ 前缀也可以使用标志,请参阅 3v4l.org/r7gSm
  • 是的,我一开始是这样做的,但是有很多可用的过滤器,并且几乎每个新的 PHP 主要版本都添加了新的过滤器。
  • 不仅如此,过滤器与其标志、选项和其他参数之间也存在关系。这并不能很好地映射 1:1。无论如何,对于您给出的答案,您传递了常量的名称,但是我确实阅读了 OP 的问题以检查常量值(不是它的名称)。另外对于您给出的答案,另请参阅stackoverflow.com/a/12482518/367456
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 2014-08-08
  • 1970-01-01
  • 2010-12-11
  • 2016-05-09
  • 2013-01-06
  • 2021-02-13
相关资源
最近更新 更多