Laravel(Blade)で出力する変数をhtmlentities関数を通さずエスケープしない方法

シェアする

Laravel(Blade)を使用していて、HTMLに出力する内容をエスケープしたくない機会というのがあると思います。

例えば、下記のようなHTMLの内容をVIEW(Blade)側で表示したい時です。

・コントローラー側(PHP)の処理

//PHP側の処理で変数にHTMLを代入する
$text = '<p><strong>Lorem</strong> ipsum dolor <img src="images/test.jpg"></p>'

しかし、普通に{{$text}}のような記載をVIEW側(Blade)で記載してもPHPのhtmlentities関数を自動的に通されるため、HTMLを出力することができません。

これは、XSS攻撃を防ぐ為に、Bladeで実行している処理です。

クロスサイトスクリプティング(XSS攻撃)とは、「他人のWebサイトへ、悪意のあるスクリプトを埋め込む」攻撃のことを言います。
クロスサイトスクリプティング

このXSS攻撃を防ぐ為に行なっているPHPのhtmlentities関数を通さず、変数の内容を表示する方法について今回は、紹介します。

それは、下記のような方法です。

<!-- ①この記載方法では、PHPのhtmlentities関数を通す。 -->
{{$text}}

<!-- ②この記載方法では、PHPのhtmlentities関数を通さずに画面出力する。 -->
{!! $text !!}

上記の例のように①のような記載方法では、XSS攻撃を防ぐ為に行なっているPHPのhtmlentities関数を通すのですが、②のように記載するとPHPのhtmlentities関数を通さずに変数の内容を画面出力することができます。

アプリケーションでユーザーの入力内容をechoする場合は注意が必要となります。コンテンツは常に二重の波括弧の記法でHTMLエンティティにエスケープすべきです。

豆知識として、覚えておくとLaravel(Blade)を使用し開発をする際に役立つ知識だと思います。