Ответ 1
Вы должны сослаться на отличный сайт OWASP для сводки об атаках (включая XSS) и защиты от них. Вот простейшее объяснение, которое я мог бы придумать, что могло бы быть более читаемым, чем их веб-страница (но, вероятно, почти никуда не полна).
-
Указание кодировки.. Прежде всего, убедитесь, что ваша веб-страница указывает кодировку UTF-8 в заголовках или в самом начале элемента
head
HTML кодирует все входы для предотвращения атаки UTF-7 в Internet Explorer (и более старых версиях Firefox), несмотря на другие усилия по предотвращению XSS. -
HTML-экранирование. Имейте в виду, что вам нужно вывести HTML-код из любого пользовательского ввода. Это включает замену
<
на<
,>
на>
,&
с&
и"
на"
. Если вы когда-либо используете однокасканные HTML-атрибуты, вам нужно заменить'
на'
. Типичные серверные языки сценариев такие как PHP предоставляют функции для этого, и я рекомендую вам расширить их, создав стандартные функции для вставки элементов HTML а не вставлять их специальным образом. -
Другие типы экранирования.. Тем не менее, вам все равно нужно быть осторожным, чтобы никогда не вводить пользовательский ввод в качестве некотируемого атрибута или атрибута, интерпретируемого как JavaScript (например,
onload
илиonmouseover
). Очевидно, что это также относится к элементамscript
, если входные данные не были надлежащим образом экранированы JavaScript, что отличается от экранирования HTML. Другой особый тип экранирования - это экранирование URL-адресов для параметров URL-адреса (сделать это до того, как HTML-экранирование будет правильно включать параметр в ссылку). -
Проверка URL-адресов и значений CSS. То же самое касается URL-адресов ссылок и изображений (без проверки на основе утвержденных префиксов) из-за схемы URL
/li >javascript:
, а также URL-адресов стилей CSS и данные в атрибутахstyle
. (Internet Explorer позволяет вставлять выражения JavaScript в качестве значений CSS, а Firefox аналогичным образом проблематичен с поддержкой XBL.) Если вы должны включить значение CSS из ненадежного источника, вы должны безопасно и строго проверить или CSS избежать его. -
Не разрешать пользовательский HTML. Не разрешайте HTML-код, предоставленный пользователем, если у вас есть опция. Это простой способ решить проблему с XSS и написать "парсер" для собственного языка разметки на основе простых регулярных выражений. Я бы разрешил форматированный текст только в том случае, если вывод HTML был сгенерирован явно безопасным способом с помощью реального анализатора, который избегает любого текста из ввода с использованием стандартных функций экранирования и индивидуально создает элементы HTML. Если у вас нет выбора по этому вопросу, используйте валидатор/дезинфицирующее средство, например AntiSamy.
-
Предотвращение XSS на основе DOM. Не включать ввод пользователя в JavaScript-код HTML и вставьте его в документ. Вместо этого используйте правильные методы DOM, чтобы убедиться, что они обрабатываются как текст, а не HTML.
Очевидно, я не могу охватить каждый случай, когда злоумышленник может вставить код JavaScript. В общем, cookie HTTP-only может использоваться, чтобы сделать атаку XSS немного сложнее (но ни в коем случае не предотвращать ее), а , обеспечивающей обучение программистам.