IT-Q

Blade の {{ $name }} と {!! $name !!} の違いは何ですか。

二重波括弧は出力時にHTMLエスケープされ、ビックリマーク付きはエスケープせず生のまま出します。後者はユーザー入力に使うとそのままスクリプトが動きます。XSS の分かれ目です。

面接官が見ているのはXSS の基礎。知らないと脆弱性を書く。

よくある答えと、面談でどう見られるか

  • 前者はHTMLエスケープされ、後者はそのまま出力される
    その通りです。後者はユーザー入力に使ってはいけません。
  • 前者は変数、後者は関数を出力する
    どちらも値の出力です。違いはエスケープの有無です。
  • 後者の方が新しい書き方で、前者は非推奨
    どちらも現役です。用途が違います。基本は前者を使います。
  • 後者はコメントアウトになる
    コメントは {{-- --}} です。

模範解答

{{ }} は出力時にHTMLエスケープされるので、ユーザーが <script> を入力してもただの文字列として表示されます。{!! !!} はエスケープせず生のまま出すので、そのままスクリプトが動きます(XSS)。

{!! !!} を使ってよいのは、自分が生成したHTMLなど信頼できる値だけです。ユーザー入力を通す必要がある場合は、HTMLPurifier などでサニタイズしてから渡します。