【问题标题】:Constant FILTER_SANITIZE_STRING is deprecated不推荐使用常量 FILTER_SANITIZE_STRING
【发布时间】:2021-11-11 09:13:05
【问题描述】:

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

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

现在我收到此错误:

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

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

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

我可以用什么代替它?

【问题讨论】:

    标签: php filter sanitization php-8.1


    【解决方案1】:

    这是一个用途可疑的过滤器。很难准确地说出它的目的是什么,或者什么时候应该使用它。由于其名称,它也与默认字符串过滤器混淆,而实际上默认字符串过滤器称为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);
      }
      

    Don’t try to sanitize input. Escape output.

    【讨论】:

    • 注意htmlspecialchars 可能不是一对一的替代品。 FILTER_SANITIZE_STRING 绊标签。 strip_tags 在这种情况下会很有用。
    • @LouisCharette 如果需要一对一替换,可以使用我创建的 polyfill。 strip_tags 也不是一对一的替代品。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多