2024
September
05
【Laravel】改行コード(\n)を認識しながらHTMLタグは文字列としてサニタイズしたい場合の方法
経緯
弊社のシステムをLaravelに移行したということもあり最近、Laravelで実装することが増えました。
お問い合わせフォーム実装時に確認画面で「お問い合わせ内容」や「備考」など自由入力できる項目の改行がなくなってしまうという現象が起きました(bladeファイル)。
上記で起きた問題の解消法を紹介します。
ソースコード
{!! nl2br(e($変数)) !!} を使う
$value = "こちらの商品の\nお見積りを\nお願いします。";
{!! nl2br(e( $value )) !!}
- e() でエスケープ(HTMLタグを文字列にする)
- nl2br() で改行(\n)を<br>に置き換える
- {!! !!}で、<br>だけエスケープをせずに表示
といった処理を行なっています。
{!! !!}とnl2br() の組み合わせだけでも表示はされますがe() 関数を使わないとHTMLタグがエスケープがされずスクリプトタグなどが埋め込まれていた場合、XSS攻撃などセキュリティ上の危険が生じます。
※ e
関数は、PHPのhtmlspecialchars
関数をdouble_encodeオプションにデフォルトでtrueを指定し、実行します。
まとめ
フレームワークを使うことでセキュリティやメンテナンス性も高まりますが例外的な処理を実装する時は気を付けなればならないなと実感しました。
今回の内容だと記述ミスでe() 関数が抜けてしまうだけでセキリティリスクが高まるため予防策としてBladeカスタムディレクティブで定義しディレクティブ名を決めて使うことでミスなくセキリティも高まるのではないかと思いました。
機会があればBladeカスタムディレクティブの使い方もブログでご紹介させていただきます。
このカテゴリの最新記事
2023.04.21
PostgreSQLで翌営業日を取得する方法
2023.09.04
【jQuery】slickでスライダーの位置がズレる時の対処法
2023.11.28
サクラエディタで便利な機能について紹介
2023.09.27
Laravel Mix(webpack)からViteに移行してみる