XSS - это в основном HTML-экранирование (*).Каждый раз, когда вы берете строку простого текста и помещаете ее на страницу HTML, независимо от того, является ли этот текст из базы данных, непосредственно из пользовательского ввода, из файла или откуда-то еще полностью, вы должны избегать его.
Минимальный выход HTML - преобразовать все символы &
в &
и все символы <
в <
.Когда вы помещаете что-либо в значение атрибута, вам также необходимо экранировать символ кавычки, используемый для разделения атрибута, обычно от "
до "
.Не вредно всегда избегать обеих кавычек ("
и апостроф одинарной кавычки '
), а некоторые люди также экранируют >
до >
, хотя это необходимо только для одного углового случая в XHTML.
Любой хороший веб-ориентированный язык должен предоставить вам такую функцию.Например, в PHP это htmlspecialchars()
:
<p> Hello, <?php htmlspecialchars($name); ?>! </p>
, а в шаблонах Smarty это модификатор escape
:
<p> Hello, {$name|escape:'html'}! </p>
на самом деле, так как экранирование HTML - это то, что вам нужно 95% отвремя (относительно редко можно разрешить включать необработанную разметку HTML), это должно было быть по умолчанию.В новых языках шаблонов стало ясно, что включение возможности выхода из HTML является огромной ошибкой, которая вызывает бесконечные дыры в XSS, поэтому HTML-выход по умолчанию.
Вы можете заставить Smarty вести себя так, изменив значение по умолчанию модификаторы до html
.( Не используйте htmlall
, как они там предлагают, если вы действительно не знаете, что делаете, или это, скорее всего, испортит все ваши символы, не относящиеся к ASCII.)
Независимо от того,Вы не должны впадать в распространенную ошибку PHP - экранирование HTML или «дезинфекцию» для HTML на входе до того, как он будет обработан или помещен в базу данных.Это неправильное место для выполнения кодирования выходного каскада, и у вас возникнут всевозможные проблемы.Если вы хотите проверить свои входные данные, чтобы убедиться, что это именно то, что ожидает конкретное приложение, то это нормально, но отсеивание или экранирование «специальных» символов на этом этапе неуместно.
*: Другие аспекты XSS присутствуют, когда(а) вы на самом деле хотите, чтобы позволяли пользователям публиковать HTML, и в этом случае вам нужно сократить его до приемлемых элементов и атрибутов, что является сложным процессом, обычно выполняемым библиотекой, такой как HTML Purifier, и дажетогда были дыры.Альтернативные, более простые схемы разметки могут помочь.И (б) когда вы разрешаете пользователям загружать файлы, что очень сложно сделать безопасным.