Laravelの {{ }} カッコの意味とエスケープ処理の仕方【初心者のLaravel講座】

Laravelセキュリティ
スポンサーリンク

Laravelのbladeファイル上では、変数を波カッコ {{ }} で囲んで表示します

これによってエスケープ処理を行っているのですが、エスケープ処理とは何か。

また、エスケープ処理をしないとどうなるのか。

初心者の方向けに、具体例入りで分かりやすく解説していきます。

じゅんこ
じゅんこ

ということで、超分かりやすく解説よろしく。

プログラマの旦那
ひつじプログラマ

了解。

スポンサーリンク

エスケープ処理とは

エスケープ処理とは、プログラミング言語、マークアップ言語を扱う際、コード部分の記号などを別の文字に置き換えること。

たとえば、次のようなコードがあるとします。

<div> テストです </div>

この文章をそのまま保存せず、カッコ部分を別の文字に置き換えます。

これによってコードではなく、文字列として扱うことができます。

エスケープ処理の目的:コードを文字列にする
じゅんこ
じゅんこ

ふぅん・・・

でも、なんでコードを文字列にする必要があるの?

プログラマの旦那
ひつじプログラマ

それは、そうしないと、とってもキケンだから!

じゅんこ
じゅんこ

えっ!

なぜエスケープ処理が必要か

エスケープ処理の主な目的は、セキュリティです。

たとえば、Web上に投稿フォームに悪意あるユーザーがアクセスしてきたとします。

ユーザーの情報を悪いサイトにもっていくコードを仕込んできたとします。

エスケープ処理を行っていなければ、コードはそのままコードとして実行されてしまいます。

こういった詐欺の手法をクロスサイトスクリプティング(XSS)と呼びます。

エスケープ処理をしないと XSS詐欺に狙われる危険がある
じゅんこ
じゅんこ

なんだか、コワい。

ひつじプログラマ
ひつじプログラマ

だよね。

だからエスケープ処理が必要なんだ。

Laravelでのエスケープ処理の方法

エスケープ処理の大事さをお伝えしましたが、ここからは、実際の処理の方法を説明します。

PHPでは、エスケープ対策のために htmlspecialchars() 関数が使われます。

htmlspecialchars (変換対象, ENT_QUOTES)
じゅんこ
じゅんこ

う、長い。

ひつじプログラマ
ひつじプログラマ
これを毎回入れるのは結構面倒だよね。
Laravelなら、波カッコでOKなんだ。
Laravelでは htmlspecialchars関数の代わりに、変数を波カッコで囲むだけでOKです。
{{ 変換対象 }}
Laravelでのエスケープ処理は、二重波カッコで囲むだけ
なおLaravelの公式マニュアルには、次のように記載されています。
Bladeの{{ }}記法はXSS攻撃を防ぐため、自動的にPHPのhtmlspecialchars関数を通されます。
*参考元:Laravel公式マニュアル  bladeテンプレート
じゅんこ
じゅんこ

波カッコで囲むだけって、簡単!

ひつじプログラマ
ひつじプログラマ

Laravelは、セキュリティ対策がしやすいんだ。

じゅんこ
じゅんこ
ただ波カッコで囲むと、どんなふうになるのか、イマイチ実感できていないかも。
ひつじプログラマ
ひつじプログラマ

それじゃ実際に試してみよう。

Laravelでエスケープ処理をテストした結果

それではLaravelで、実際にエスケープ処理の効果を見てみましょう。
下記のようなjavascriptのコード入りの投稿をしてみます。
保存した投稿をエスケープ処理なしで表示してみると、このようになります。
見事、javascriptのプログラムが動作してしまっています。
では次に、次のようにエスケープ処理をした結果を表示してみましょう。
{{$post->body}}
するとこのように、コードが実行されず、きちんと文字列として表示されます。
じゅんこ
じゅんこ

ちゃんと文字になってる!

ひつじプログラマ
ひつじプログラマ

エスケープ処理のおかげだよ。

じゅんこ
じゅんこ

ところでエスケープ処理をすると、なんでこんなふうに表示されるの?

ひつじプログラマ
ひつじプログラマ

それは、ソースコードを見れば分かるよ。

エスケープ処理をしたときのソースコードは、次のようになっています。
コードの開きカッコや、 &lt;  、閉じカッコ &gt; などが置き換わっています。
これらは見た目はカッコとして表示されますが、実は別物。
このようにして、コードが実行されないようになっているのです。

なお、このように本来の動作を無効にする文字をエスケープ文字と呼びます。

エスケープ処理によってカッコなどがエスケープ文字に置き換わる

おまけ:エスケープ処理を無効にするには

ちなみにLaravelでは、「あえてエスケープ処理をしたくない」という場合もあります。

この場合には、波カッコをひとつ減らし、エクスクラメーションマーク(びっくりマーク)を2つ付けましょう。

{!! $post->body !!}
エスケープを無効にしたければ、{!! !!} で対象を囲めば良い

ただし、この処理をするときには注意してください。

使うにしても、自分や限られたメンバーによる投稿内容に制限したほうが、無難です。

Laravelのマニュアルでも、エスケープせずに投稿内容を表示することについて、次のように警告をしています。

ユーザーの入力を表示するときは、常に二重の波括弧の記法でHTMLエンティティにエスケープすべきです。

*参考元:Laravel公式マニュアル  bladeテンプレート

さいごに

今回のポイントをまとめると、次の5点。

  • エスケープ処理の目的:コードを文字列にすること
  • エスケープ処理をしないと XSS詐欺に狙われる危険がある
  • Laravelでのエスケープ処理は、二重波カッコで囲むだけ
  • エスケープ処理によってカッコなどがエスケープ文字に置き換わる
  • エスケープを無効にしたければ、{!! !!} で対象を囲めば良い

 

エスケープ処理のほかにも、実は大事なセキュリティ対策があります。

セキュリティ対策と詐欺の手法をまとめた記事があるので、併せて参考にしてくださいね。

Laravelセキュリティ

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中!
会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

【個別サポート実施中】

「本ブログに記載の方法を試してみたけれど、うまくいかない」「コードを見てほしい」という方のために、有償でメールサポートいたします。以下のボタンをクリックして相談フォームにアクセスして下さい。

詳しく見る

Twitter始めました。
スポンサーリンク
40代からプログラミング!

コメント

タイトルとURLをコピーしました