13

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

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

现在我得到这个错误:

不推荐使用:不推荐使用常量 FILTER_SANITIZE_STRING

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

不推荐使用:不推荐使用常量 FILTER_SANITIZE_STRIPPED

我可以用什么代替它?

4

2 回答 2

18

这是一个用途可疑的过滤器。很难准确地说出它的目的是什么,或者什么时候应该使用它。由于它的名称,它也与默认字符串过滤器混淆,而实际上默认字符串过滤器被调用FILTER_UNSAFE_RAW。PHP 社区决定不再支持使用此过滤器。

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

如果你想更换它,你有几个选择:

  1. FILTER_UNSAFE_RAW使用不进行任何过滤的默认字符串过滤器。如果您不知道 的行为FILTER_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);
    }
    

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

于 2021-09-16T11:10:25.950 回答
8

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

于 2021-12-13T09:40:28.957 回答