Blade の {{ }} と {!! !!} は何が違いますか。
自分が生成した信頼できるHTMLだけです。ユーザー入力を通すと、そのままスクリプトが動きます。二重波括弧はエスケープされるので、文字列として安全に表示されます。
面接官が見ているのはXSS の基礎の補強。
これは「Laravel が標準で守ってくれるものと、自分で書く必要があるものの区別として正しいのはどれですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- {{ }} はHTMLエスケープされ、{!! !!} はそのまま出力される
その通りです。後者を使ってよいのは自分が生成したHTMLなど信頼できる値だけです。 - {{ }} は変数、{!! !!} は関数の出力に使う
どちらも値の出力です。違いはエスケープの有無です。 - {!! !!} の方が新しい書き方
新旧ではなく用途の違いです。 - 両方ともエスケープされるので安全
{!! !!} はエスケープしません。ここを誤解すると XSS を作ります。
面接官は何を見ているか
- {{ }} は自動でHTMLエスケープされると言えた
- {!! !!} は生のまま出力されると言えた
- 後者を使う場合の条件(信頼できる値のみ)に触れた
模範解答
{{ }} は出力時にHTMLエスケープされるので、ユーザーが <script> を入力しても文字列として表示されます。{!! !!} はエスケープせずそのまま出すので、そのままスクリプトが動きます。使ってよいのは、自分が生成したHTMLなど信頼できる値だけです。ユーザー入力を通す必要がある場合は、HTMLPurifier のようなライブラリでサニタイズしてから渡します。