FILTER_SANITIZE_STRINGはダメです。

PHP8.1になってから「FILTER_SANITIZE_STRING」は非推奨になりました。

「FILTER_SANITIZE_STRING」はfilter_inputやfilter_varで利用するフィルターの一つです。
特に「FILTER_SANITIZE_STRING」を多様してた訳では何ですがその名前から「文字を無害化」するというイメージで簡易的に処理したいときには使っていました。
非推奨の知らせを受けて改めて調べてみました。

公式の解説「PHP: 除去フィルタ – Manual」によるとFILTER_SANITIZE_STRINGは下記の様になってます。

タグと、エンコードされたシングルクォート、ダブルクォートを取り除きます。 オプションで、 特殊文字を取り除いたりエンコードしたりします。 クォートをエンコードする動作は、 FILTER_FLAG_NO_ENCODE_QUOTES を設定することで無効に出来ます。

削除の知らせを受けて調べてみたら「100 > <p>”テスト”</p> < 100」みたいな文字は「100 > &#34;テスト&#34; 」と微妙にな結果です。
HTMLの閉じタグはそのままですし、ダブルクォートは消えずにHTMLエンティティされてますし、右側が消えてしまってます。

私が公式の文章を見て想像したのはstrip_tagsでタグを除去してタグの記号やシングルクォート、ダブルクォートが消えた状態です。

私の想像したフィルター処理を書いて見ました。

$sample = filter_input(INPUT_POST, "sample", FILTER_DEFAULT);
if ($sample !== null && $sample !== false) {
  $sample = filter_var($sample, FILTER_DEFAULT, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK);
  $sample = str_replace(array('"', "'", "<", ">"), "", strip_tags($sample));
  echo htmlspecialchars($sample, ENT_QUOTES, "UTF-8"));
}

時と場合によりますがfilter_inputではチェックせずにfilter_varでチェックさせる事が多いです。
多少冗長ですが2つに分ける事で数字入力の際に全角数字を入力してしまう方の為に前もって半角数値に変換した後でバリデーションを掛けたりできたりします。
オプションは
FILTER_FLAG_STRIP_LOWはASCIIコードが32未満の文字が除去されます。改行やタブが必要な場合は前処理でエスケープする必要があります。
FILTER_FLAG_STRIP_HIGHはASCIIコードが127より大きいの文字が除去されます。マルチバイト文字を除去したい時に使用します。
FILTER_FLAG_STRIP_BACKTICKはバッククォート文字を除去します。

HTMLエンティティするならFILTER_SANITIZE_SPECIAL_CHARSというのがありますがコチラは8.1でも利用できます。
ただhtmlspecialcharsは「&quot; &gt; &lt;」と文字式ですがFILTER_SANITIZE_SPECIAL_CHARSは「&#34; &#62; &#60;」と数字式なので戻す際には注意が必要です。

Tags:

トラックバック

コメントを書く