Безопасность сайта — это бесконечная битва между веб-мастерами и хакерами. В </xssed> зарегистрировано около 40,000 сайтов, подверженных атакам XSS. XSS-атаки позволяют злоумышленникам красть cookie, личную информацию, взламывать аккаунты и многие другие вещи.
Существует множество способов для защиты сайта, но ни один из них не может гарантировать абсолютную безопасность. Как следствие, нужно использовать многоуровневую эшелонную зашиту для обеспечения безопасности сайта.
В данной статье будет показан один из вариантов защиты — основанный на использовании заголовков HTTP.
Современные браузеры сами предоставляют довольно мощную защиту для своих пользователей… Единственное «но» — сайт должен попросить браузер включить эту защиту. К счастью, это довольно просто.
Для Apache:
Header set X-Frame-Options DENY
# Разрешить выполнение JavaScript, загруженного только с нашего домена.
# Не выполнять встроенный (inline) JavaScript
Header set X-Content-Security-Policy "allow 'self';"
# Включение предотвращения XSS-атак в IE 8
Header set X-XSS-Protection "1; mode=block"
Для nginx:
add_header X-Content-Security-Policy "allow 'self';";
add_header X-XSS-Protection "1; mode=block";
X-Frame-Options
Данный заголовок указывает браузеру, можно ли загружать страницы сайта через <frame>/<iframe>.
Значение DENY запретит загрузку через фреймы, значение SAMEORIGIN разрешит загрузку через фреймы, но только если и фрейм, и страница, его загружающая, находятся на одном домене (Same Origin Policy).
основная функция данной защиты — предотвращение кликджекинга; в качестве дополнительного бонуса это позволит предотвратить атаку, описанную Ben Schmidt.
Заголовок воспринимается Internet Explorer 8.0+, Firefox 3.6.9+ (Gecko 1.9.2.9+), Opera 10.50+, Safari 4.0+, Chrome 4.1.249.1042+.
Подробное описание приведено здесь.
X-Content-Security-Policy
Данный заголовок указывает, как контент на сайте взаимодействует с самим сайтом. При помощи данного заголовка можно указывать, откуда можно загружать картинки, JavaScript, фреймы, шрифты, объекты, таблицы стилей, медиаконтент и многое другое.
Приведённый в примере выше заголовок разрешает загрузку контента только с того же домена, на котором располагается загружаемая страница. При этом браузеру запрещается выполнение встроенного JavaScript (скрипты внутри блоков <script>…</script>, обработчики событий и т.п.), создание кода из строк (например, через функцию eval(), а также передача строк в функции setTimeout(), setInterval() и т.п.), использование протокола data:.
Данный заголовок можно использовать на HTTPS-страницах для запрета загрузки небезопасного контента:
Подробнее о заголовке и поддерживаемых параметрах можно прочитать здесь.
X-XSS-Protection
Данный заголовок работает исключительно в Internet Explorer: он включает встроенную в браузер защиту от XSS-атак (по умолчанию она отключена, так как может некорректно работать с некоторыми сайтами). Подробная информация о принципах работы защиты от XSS-атак в IE приведена в The Windows Internet Explorer Weblog.
В заключение стоит отметить, что хоть данный способ и хорош, он должен использоваться вкупе с другими средствами защиты и быть частью комплексной системы безопасности. Безопасность лишней не бывает!
Меня зовут
Как быть с “годными” сторонними яваскриптами, исполнение которых требуется. Например, счетчиками?
Как-нибудь так:
X-Content-Security-Policy: allow 'self'; img-src *; script-src *.counter.example.com *.counter.example.org; options eval-script inline-scriptLeave a comment below if you dare
If by accident you see this form, please do not use it; use the form below this instead.