PHP の公式ドキュメントによると、ファイルのアップロードを処理するときは、ディレクトリ トラバーサルやその他の種類の攻撃に対してファイル名をサニタイズする必要があります。
// basename() may prevent filesystem traversal attacks;
// further validation/sanitation of the filename may be appropriate
$name = basename($_FILES["pictures"]["name"][$key]);
それにもかかわらず、デフォルトでは、ファイル名は PHP スクリプトに到着した時点ですでにサニタイズされていることがわかりました。
私は、Apache が悪意のあるファイル名 filename="../file.png" を受け取ったという証拠を持っていますが、PHP スクリプトは代わりに $_FILES 変数でサニタイズされた名前を読み取ります。
Apache 入力の低レベル ダンプ:
mod_dumpio: dumpio_in (data-HEAP):
--------------------------eb8b65b665870e02
Content-Disposition: form-data;
name="attachment";
filename="../file.png" ← [Malicious file name]
Content-Type: image/png
PHP スクリプト
echo $_FILES['attachment']['name']; ← [File name already sanitised: 'file.png']
PHP 5.5 から 7.2 を実行している Apache モジュールと php-fpm の両方でこの動作が見つかりました。変数をスクリプトに渡す前に、PHP インタープリターがこのサニタイズを実行すると推測する必要があります。
だから、私の知らないうちに同意なしに私のためにサニテーションをしてくれたPHPに感謝します。ただし(これが私の質問です)、この機能は文書化されていないことがわかっているため、サニタイズ基準/正規表現/アルゴリズムを知りたいので、それが私のニーズを満たしていることを確認してください。