Як екранувати виведення у шаблонах

Як екранувати виведення у шаблонах

Під час генерування HTML із шаблону, завжди існує ризик того, що змінна шаблону може вивести ненавмисний HTML або небезпечний код клієнтської сторони. Результатом буде те, що динамічний зміст може поламати HTML сторінки результату, або дозволити зловмисному користувачеві виконати міжсайтовий скриптинг (XSS-атаку). Розгляньте цей класичний приклад:

1
Hello {{ name }}

Уявіть, що користувач вводить такий код як своє ім'я:

1
<script>alert('hello!')</script>

Без будь-якого екранування виведення, результуючий шаблон призведе до виклику вікна попереджувального повідомлення JavaScript:

1
Hello <script>alert('hello!')</script>

І хоч це і виглядає нешкідливо, якщо користувач може зайти так далеко, то той самий користувач так само може написати Java-script, що виконує зловмисні дії всередині безпечної зони незнаючого легального користувача.

Вирішенням цієї проблеми є екранування виведення. З увімкненим екрануванням виведення, той самий шаблон відображатиметься без шкоди, і буквально виводитиме на екран тег script:

1
Hello &lt;script&gt;alert(&#39;hello!&#39;)&lt;/script&gt;

Системи шаблонів Twig і PHP підходять до проблеми по-різному. Якщо ви використовуєте Twig, то екранування виведення ввімкнено за замовчуванням і ви захищені. У PHP, екранування виведення не автоматичне, що означає, що вам вручну потрібно буде екранувати там, де це необхідно.

Екранування виведення в Twig

Якщо ви використовуєте шаблони Twig, тоді екранування виводу ввімкнено за замовчуванням. Це означає, що ви одразу після встановлення захищені від ненавмисних наслідків коду, надісланого користувачем. За замовчуванням, екранування виведення передбачає, що зміст екранується для виведення HTML.

У деяких випадках, вам знадобиться відключити екранування виведення, коли ви відображаєте змінну, якій можна довіряти і яка містить розмітку, яку не варто екранувати. Уявіть, що користувачі-адміністратори можуть писати статті, що містять HTML-код. За замовчуванням, Twig буде екранувати тіло статті.

Щоб відобразити її нормально, додайте фільтр raw:

1
{{ article.body|raw }}

Ви також можете відключити екранування виведення всередині зони {% block %}, або в усьому шаблоні. Щоб дізнатися більше інформації, дивіться Екранування виведення в документації Twig.

Екранування виведення в PHP

Екранування виведення не автоматичне при використанні PHP-шаблонів. Це означає, що хіба що ви чітко не виберете екранувати змінну, то ви не захищені. Щоб використовувати екранування виведення, використовуйте спеціальний метод перегляду escape():

1
Hello <?php echo $view->escape($name) ?>

За замовчуванням, метод escape() передбачає, що змінна відображається в HTML-контексті (і тому змінна екранується для безпеки HTML). Другий аргумент дозволяє вам змінити контекст. Наприклад, щоб вивести щось у рядку Java-скрипта, використовуйте контекст js:

1
var myMsg = 'Hello <?php echo $view->escape($name, 'js') ?>';