Blade の {{ $name }} と {!! $name !!} の違いは何ですか。
二重波括弧は出力時にHTMLエスケープされ、ビックリマーク付きはエスケープせず生のまま出します。後者はユーザー入力に使うとそのままスクリプトが動きます。XSS の分かれ目です。
面接官が見ているのはXSS の基礎。知らないと脆弱性を書く。
よくある答えと、面談でどう見られるか
- 前者はHTMLエスケープされ、後者はそのまま出力される
その通りです。後者はユーザー入力に使ってはいけません。 - 前者は変数、後者は関数を出力する
どちらも値の出力です。違いはエスケープの有無です。 - 後者の方が新しい書き方で、前者は非推奨
どちらも現役です。用途が違います。基本は前者を使います。 - 後者はコメントアウトになる
コメントは {{-- --}} です。
模範解答
{{ }} は出力時にHTMLエスケープされるので、ユーザーが <script> を入力してもただの文字列として表示されます。{!! !!} はエスケープせず生のまま出すので、そのままスクリプトが動きます(XSS)。
{!! !!} を使ってよいのは、自分が生成したHTMLなど信頼できる値だけです。ユーザー入力を通す必要がある場合は、HTMLPurifier などでサニタイズしてから渡します。