常量FILTER_SANITIZE_STRING已弃用

2022-08-30 16:33:19

我已经安装了PHP 8.1,并开始测试我的旧项目。我像这样使用过滤器:FILTER_SANITIZE_STRING

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

现在我得到这个错误:

已弃用:常量FILTER_SANITIZE_STRING已弃用

当我使用时,也会发生同样的情况:FILTER_SANITIZE_STRIPPED

已弃用:常量FILTER_SANITIZE_STRIPPED已弃用

我可以用什么来代替它?


答案 1

这个过滤器的目的不明确。很难说它到底是为了完成什么,或者什么时候应该使用它。由于它的名称,它也与默认字符串过滤器混淆,而实际上默认字符串过滤器被称为。PHP 社区决定不再支持使用此过滤器。FILTER_UNSAFE_RAW

此过滤器的行为非常不直观。它删除了字符串末尾之间的所有内容,或者直到下一个 .它还删除了所有字节。最后,它编码并放入其HTML实体中。<>NUL'"

如果要替换它,您有几种选择:

  1. 使用不执行任何筛选的默认字符串筛选器。如果您不知道 的行为,并且只想使用默认筛选器来为您提供字符串值,则应使用此选项。FILTER_UNSAFE_RAWFILTER_SANITIZE_STRING

  2. 如果您使用此过滤器来防止 XSS 漏洞,则将其用法替换为 htmlspecialchars()。。不要对输入数据调用此函数。要防范 XSS,您需要对输出进行编码!

  3. 如果您确切地知道该过滤器的作用,并且想要创建一个polyfill,则可以使用正则表达式轻松完成此操作。

    function filter_string_polyfill(string $string): string
    {
        $str = preg_replace('/\x00|<[^>]*>?/', '', $string);
        return str_replace(["'", '"'], ['&#39;', '&#34;'], $str);
    }
    

不要尝试清理输入。转义输出。


答案 2

如果您打算在安全的 html 字符串中转换变量,则可以改用的最接近的常量是FILTER_SANITIZE_FULL_SPECIAL_CHARS


推荐