2024
October
17
【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.12.08
【DB】テーブル設計アンチパターン
2024.08.29
ChatGPT APIとC#(またはPython)を活用したAIメール応答システムの構築方法
2024.10.23
名刺を画像から読み取り、ChatGPTで解析するシステムの構築 その1
2024.06.14
WITH句を使った最終行に合計行を追加する方法