{{ $value }} екранує вивід через htmlspecialchars, а {!! $value !!} виводить як є.
{{ $user->name }} {{-- <b>Ада</b> покажеться як текст --}}
{!! $post->html !!} {{-- теги спрацюють --}}
Чому це важливо: якщо користувач запише в ім'я <script>...</script>, {{ }} покаже це як текст, а {!! !!} виконає скрипт у браузері кожного, хто відкриє сторінку. Це XSS - викрадення сесії, дії від імені жертви.
Правила:
- за замовчуванням - лише
{{ }}; {!! !!}- для HTML, який згенерував сам застосунок (Markdown, перетворений безпечним рендерером, чи HTML, очищений HTML Purifier);- вміст від користувача в
{!! !!}без очищення - ніколи.
Пастки, які екранування не закриває:
href="{{ $url }}"зjavascript:alert(1)- екранування не забороняє схему, такі посилання валідують (url:http,https);- дані в
<script>- для JavaScript берутьJs::from($data), а не{!! json_encode() !!}.
Для JavaScript-фреймворків, що теж використовують фігурні дужки, є @{{ name }} - Blade залишить вираз як є.