IT-Q

Blade の {{ }} と {!! !!} は何が違いますか。

自分が生成した信頼できるHTMLだけです。ユーザー入力を通すと、そのままスクリプトが動きます。二重波括弧はエスケープされるので、文字列として安全に表示されます。

面接官が見ているのはXSS の基礎の補強。

これは「Laravel が標準で守ってくれるものと、自分で書く必要があるものの区別として正しいのはどれですか。」への追撃質問です。

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

  • {{ }} はHTMLエスケープされ、{!! !!} はそのまま出力される
    その通りです。後者を使ってよいのは自分が生成したHTMLなど信頼できる値だけです。
  • {{ }} は変数、{!! !!} は関数の出力に使う
    どちらも値の出力です。違いはエスケープの有無です。
  • {!! !!} の方が新しい書き方
    新旧ではなく用途の違いです。
  • 両方ともエスケープされるので安全
    {!! !!} はエスケープしません。ここを誤解すると XSS を作ります。

面接官は何を見ているか

  • {{ }} は自動でHTMLエスケープされると言えた
  • {!! !!} は生のまま出力されると言えた
  • 後者を使う場合の条件(信頼できる値のみ)に触れた

模範解答

{{ }} は出力時にHTMLエスケープされるので、ユーザーが <script> を入力しても文字列として表示されます。{!! !!} はエスケープせずそのまま出すので、そのままスクリプトが動きます。使ってよいのは、自分が生成したHTMLなど信頼できる値だけです。ユーザー入力を通す必要がある場合は、HTMLPurifier のようなライブラリでサニタイズしてから渡します。