最近と言ってもPHP5系時代なので、最近じゃないとツッコまれそうですが、header()関数に改行を用いたHTTPヘッダインジェクション攻撃は対策されていました。
イメージとしては、header()関数に改行付きの攻撃を仕掛けるイメージです。
# https://zenn.dev/shlia/articles/f446bde2b7594a # http://localhost/?url=http://localhost/%0d%0aSet-Cookie:+PHPSESSID%3Dhogehoge header('Location: ' . $_GET['url']);
このケースを解釈すると、header関数に改行を含めたコンテンツを渡し、複数ヘッダーを出力しようとします。
header("Location: http://localhost Set-Cookie: PHPSESSID=hogehoge");
[PHPウォッチ]第23回 セキュリティ上の問題などを修正したPHP 5.1.2,PHP 4.4.2リリース
改行をサニタイズ処理することで、複数ヘッダー攻撃を回避する方法が、PHP5系時代に実装されました。
header()関数における「HTTPレスポンス分割攻撃(HTTP Response Splitting Attack)」に対する脆弱性
「HTTPレスポンス分割」とは,HTTPレスポンスヘッダーにCR+LFやContent-Length: 0を含めること一つのHTTPレスポンスを複数のHTTPレスポンスであるように偽装し,ブラウザやProxyのキャッシュに悪意のあるHTTPレスポンスヘッダーを残す攻撃手法である。
これにより,この脆弱性を利用された場合,フィッシング詐欺などの被害が発生する可能性がある。この問題を回避するためには,HTTPレスポンスヘッダーの中にあるCR+LFをサニタイズする必要がある。本バージョンでは,header()関数の内部処理においてこのサニタイズ処理を追加し,安全性を向上させている。
https://xtech.nikkei.com/it/article/COLUMN/20060117/227354/
あとがき
PHPがheader()関数でサニタイズしてくれるとは言え、ほとんどのケースで改行ありヘッダーは想定外と思われます。 事前にしっかりバリデーションは推奨いたします。