Существует распространенная Web-атака под названием Cross-Site Scripting (XSS). Например, пользователь специально вводит некоторые данные, например код JavaScript, в Web-форму, а затем Web-страница отображает эту информацию дословно, без надлежащей обработки специальных символов. Стандартные примеры такой ситуации связаны с гостевыми книгами или форумами. Люди вводят текст, чтобы другие его могли увидеть.
Код <?PHP $input = '<script>alert("Сайт взломан");</script>'; echo htmlspecialchars($input) . '<br>'; echo htmlentities($input); ?>
В данном случае нужно было удалить определенную разметку HTML. Не будем долго останавливаться на этой теме, просто скажем: все поппытки внедрения сценариев JavaScript в данные, отловить практически невозможно. Они выполняются не только с помощью тега <script>, но и посредством других элементов HTML, например <img onabort="badcode()">. Следовательно, в большинстве случаев следует удалять весь HTML-код. Проще всего это сделать, вызвав функцию htmlspecialchars(), которая проверяет строки в HTML-коде и заменяет все символы < и > сочетаниями < и >. Другая возможность - вызвать функцию htmlentities(). В результате для представления символов будут использованы объекты HTML (если это возможно).
Использование функций htmlspecialchars() и htmlentities() просто позволяет вывести на экран то, что пользователь набирает в браузере. Таким образом, если пользователь вводит разметку HTML, эта разметка показывается. Следовательно, функции htmlspecialchars() и htmlentities() удобны для браузера, но могут быть неудобны для пользователя.
Впрочем, существует фунция strip_tags(), которая полностью избавляется от всех элементов HTML. Если вы просто хотите сохранить некоторые элементы (например, какое-то элементарное форматирование, задаваемое посредством тегов <b>, <i> и <br>), во втором параметре функции strip_tags() следует представить список разрешенных значений.
Код <?PHP $input = 'Hello <b><i>world</i></b>' . '<script>alert("Сайт взломан");</script>'; echo strip_tags($input, '<b><br><i>'); ?>
В результате видно, что все нежелательные теги HTML удалены, но содержимое осталось без изменений. |