常量 FILTER_SANITIZE_STRING 已弃用

Dha*_*man 81 php sanitization filter php-8.1

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

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)

现在我得到这个错误:

已弃用:常量 FILTER_SANITIZE_STRING 已弃用

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

已弃用:常量 FILTER_SANITIZE_STRIPPED 已弃用

我可以用什么来代替它?

Dha*_*man 87

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

\n

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

\n

如果您想更换它,您有以下几种选择:

\n
    \n
  1. FILTER_UNSAFE_RAW使用不执行任何过滤的默认字符串过滤器。如果您不了解以下行为,则应使用此方法FILTER_SANITIZE_STRING并且只想使用默认过滤器来为您提供字符串值,则应该使用此方法。

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

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

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

Don\xe2\x80\x99t 尝试清理输入。转义输出。

\n

  • 请注意,“htmlspecialchars”可能不是一对一的替代。`FILTER_SANITIZE_STRING` 行程标签。在这种情况下,“strip_tags”会很有用。 (5认同)
  • 我理解需要对输出进行编码。然而,我认为不使用 FILTER_UNSAFE_RAW 过滤输入的决定是非常糟糕的决定。没有人希望数据库完全混乱。我肯定非常想念 FILTER_SANITIZE_STRING 。 (3认同)
  • @Dharman,用“FILTER_SANITIZE_SPECIAL_CHARS”替代“FILTER_SANITIZE_STRING”怎么样?或者,循环遍历[值](/sf/ask/265612581/#3794543)。 (2认同)

Cho*_*tou 55

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


fra*_*sco 11

文档中您应该将其替换为htmlspecialchars().

FILTER_SANITIZE_STRING

去除标签并对双引号和单引号进行 HTML 编码,还可以选择去除或编码特殊字符。可以通过设置 FILTER_FLAG_NO_ENCODE_QUOTES 来禁用引号编码。(从 PHP 8.1.0 开始已弃用,请使用 htmlspecialchars() 代替。)

FILTER_SANITIZE_STRIPPED 过滤器

“字符串”过滤器的别名。(从 PHP 8.1.0 开始已弃用,请使用 htmlspecialchars() 代替。)