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. フィルターが何をするかを正確に知っていて、ポリフィルを作成したい場合は、正規表現を使用して簡単に作成できます。

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

入力をサニタイズしようとしないでください。出力をエスケープします。

于 2021-09-16T11:10:25.950 に答える