Комментарий: Предисловие: После появления HTML5 сетевая безопасность привлекла более широкое внимание. Какие усовершенствования внесены в сеть безопасности? Как мы сталкиваемся с все более опасным кибер -мошенничеством и нападениями? В следующей статье рассказывается о последнем решении W3C этой проблемы. Если у меня будет возможность в будущем, я буду проводить контент HTML5 на XSS, P3P, гомологичной политике, CORS (кросс-доменное обмен ресурсами) и CSP.
Политика безопасности Всемирной паутины коренится в гомологичной политике. Например, код может получить доступ только к данным, но не имеет разрешений на доступ. Каждый источник отделен от остальной части сети, создавая безопасную песочницу для разработчиков. Это идеально в теории, но теперь нападавшие нашли умный способ уничтожить систему.Это атака сценариев XSS, обходящая гомологичные политики с помощью поддельного контента и обманщиков. Это большая проблема, если злоумышленник успешно вводит код, будет утечено значительное количество пользовательских данных.
Теперь мы вводим совершенно новую и эффективную стратегию защиты безопасности, чтобы снизить этот риск, который является политикой содержания безопасности (CSP).
Источник белого списка
Ядро атак XSS заключается в том, что браузер не может сказать, вводит ли сценарий третьей стороной или действительно является частью вашего приложения. Например, кнопка Google +1 будет загружать и выполнять код из https://apis.google.com/js/plusone.js, но мы не можем рассчитывать на изображениях из фотографий в браузере, действительно ли код от apis.google.com или от apis.evil.example.com. Браузер загружает и выполняет запрос страницы для любого кода, независимо от его источника.
CSP определяет заголовок CONTE-SECUTY POLICYHTTP, который позволяет вам создавать белый список надежных источников, чтобы браузер выполнял только и отдает ресурсы из этих источников, а не слепо доверяя всему, предоставленному сервером. Даже если злоумышленник может найти уязвимость для введения сценария, он не будет выполнен, поскольку источник не включен в белый список.
Кнопка Google +1 выше является примером, потому что мы считаем, что APIS.Google.com предоставляет допустимый код, а также мы сами, мы можем определить политику, которая позволяет браузеру выполнять сценарии из одного из двух источников ниже.
Контент-безопасность-политика: Script-Src 'self' https://apis.google.com
Разве это не очень просто? Script-Src может управлять разрешениями, связанными с скриптом для указанных страниц. Таким образом, браузер будет загружать и выполнять только сценарии с самой этой страницы и с этой страницы.
Как только мы определим эту политику, браузер бросит ошибку, когда он обнаружит инъекционный код (обратите внимание, что это за браузер).
Политики безопасности контента применяются ко всем общим ресурсам
Хотя ресурсы сценариев являются наиболее очевидными рисками безопасности, CSP также предоставляет богатый набор инструкций, которые позволяют страницам контролировать загрузку различных типов ресурсов, таких как следующие типы:
Контент-SRC: ограничить тип соединения (например, XHR, WebSockets и Eventsource)
Font-Src: управляет источником сетевых шрифтов. Например, вы можете использовать веб-шрифты Google через font-src https://themes.googleusercontent.com.
Frame-Src: перечисляет источник кадров, которые могут быть встроены. Например, Frame-Src https://youtube.com позволяет только видео, встроенные в YouTube. Полем
IMG-SRC: определяет источник загружаемого изображения.
Media-Src: ограничить источник видео и аудио.
Object-Src: ограничить источник вспышки и других плагинов.
Style-Src: аналогично Script-Src, он работает только в файле CSS.
По умолчанию все настройки включены без каких -либо ограничений. Вы можете разделить несколько инструкций по полуколонам, но аналогично Script-Src https: //host1.com; script-src https://host2.com, вторая инструкция будет проигнорирована. Правильный способ написать это Script-Src https://host1.com https://host2.com.
Например, у вас есть приложение, которое необходимо загружать все ресурсы из сети распределения контента (CDN, например, https://cdn.example.net) и знать, что содержание кадров и плагинов необходимо, ваша стратегия может выглядеть так:
Контент-безопасность POLICY: по умолчанию-SRC https://cdn.example.net; Frame-Src 'none'; Object-Src 'none'
деталь
Заголовок HTTP, который я использовал в своем примере, является политикой контента, но современные браузеры уже обеспечили поддержку с помощью префиксов: Firefox использует X-контент-безопасность-политику, Webkit использует X-Webkit-CSP. В будущем он постепенно переходит к единым стандартам.
Стратегия может быть установлена для каждой другой страницы, которая обеспечивает большую гибкость. Потому что на некоторых страницах на вашем сайте могут быть кнопки Google +1, а другие - нет.
Список источника каждой инструкции может быть довольно гибким. Вы можете указать шаблон (Data:, https :), или указать имя хоста в диапазоне (example.com, который соответствует любому источнику, любому режиму и любому порту на хосте), или указать полный URI (https://example.com:443, в частности, протокол https, имя домена.
Вы также можете использовать четыре ключевых слова в списке источников:
Нет: вы можете ожидать что -нибудь несоответствующее
Self: то же самое, что и текущий источник, но не содержит субдоменов
небезопасно: разрешает встроенный JavaScript и CSS
небезопасные: механизмы, которые позволяют тексту к JS, таким как оценка
Обратите внимание, что эти ключевые слова должны быть указаны.
Песочница
Здесь стоит обсудить еще одну инструкцию: Песочница. Это несколько несовместимо с другими инструкциями. В основном он контролирует поведение, взятое на странице, а не ресурсы, которые может загрузить страницу. Если это свойство установлено, страница будет вести себя как рама с набором свойств песочницы. Это оказывает широкий спектр влияния на страницу, например, предотвращение представлений формы и т. Д. Это немного за пределами сферы действия этой статьи, но вы можете найти больше информации в разделе «Настройки логотипа песочницы HTML5».
Вредный встроенный код
CSP основан на исходных белых списках, но он не решает самый большой источник атак XSS: встроенный сценарий. Если злоумышленник может вводить теги скрипта, содержащие вредный код (<script> sendmydatatoevildotcom (); </script>), у браузера нет хорошего механизма для различения этого тега. CSP может решить эту проблему только путем совершенно запрещения встроенных сценариев.
Этот запрет включает в себя не только теги сценариев, встроенные в сценарий, но и встроенные обработчики событий и Javascrpt: URL. Вам необходимо поместить содержимое тега сценария в внешний файл и заменить JavaScript: и <a… onclick = [javascript]> с соответствующим addeventListener. Например, вы можете поместить следующую форму:
<Скрипт>
Функция DoAmazingThings () {
Блюдо («Ты потрясающий!»);
}
</script>
<tool> Я потрясающе? </button>
Переписать в следующую форму:
<!-потрясающе.html->
<script src = 'amest.js'> </script>
<tool> Я потрясающе? </button>
// amesrot.js
Функция DoAmazingThings () {
Блюдо («Ты потрясающий!»);
}
document.addeventlistener ('domcontentendude', function () {
Document.getElementById («Удивительно»)
.AdDeventListener ('Щелкни, DoAmazingThings);
});
Независимо от того, используете ли вы CSP или нет, приведенный выше код на самом деле имеет большие преимущества. Встроенный JavaScript полностью смешивает структуру и поведение, вы не должны этого делать. Кроме того, аутрич -ресурсы легче кэшировать в браузерах, легче понять разработчикам, и их легко компилировать и сжать. Если вы используете информационно -пропагандистский код, вы напишете лучший код.
Встроенные стили должны быть обработаны одинаково, как атрибуты стиля, так и теги стиля должны быть извлечены во внешнюю таблицу стилей. Это может предотвратить все виды магической утечки данных.
Если вам нужны встроенные сценарии и стили, вы можете установить «небезопасное значение для атрибута Script-SRC или Style-SRC. Но не делай этого. Запрещение встроенных сценариев является максимальной гарантией безопасности, предоставленной CSP. В то же время, запрещение встроенных стилей может сделать ваше приложение более безопасным и надежным. Это компромисс, но оно того стоит.
Оценка
Даже если злоумышленник не может вводить скрипт напрямую, он может побудить ваше приложение преобразовать вставленный текст в исполняемый сценарий и выполнить его самостоятельно. eval (), newfunction (), settimeout ([string], ...) и setInterval ([string], ...) могут стать такими опасными носителями. Стратегия для CSP, чтобы нацелиться на этот риск, заключается в том, чтобы полностью блокировать эти векторы.
Это имеет некоторые последствия для того, как вы создаете свое приложение:
Parse json через встроенный json.parse, не полагаясь на оценку. Браузеры после IE8 поддерживают местные операции JSON, что совершенно безопасно.
Перепишите метод вызова SetTimeout и SetInterval с помощью встроенных функций вместо строк. Например:
settimeout (document.queryselector ('a'). style.display = 'none';, 10);
Может быть переписано как:
setTimeout (function () {document.queryselector ('a'). style.display = 'none';}, 10);
Избегайте встроенных шаблонов во время выполнения: многие библиотеки шаблонов используют New Function () для ускорения генерации шаблонов. Это отлично подходит для динамических программ, но это рискованно для вредоносного текста.
Отчет
CSP может блокировать ненадежные ресурсы на стороне сервера, что очень полезно для пользователей, но для нас очень полезно получить различные уведомления, отправленные на сервер, чтобы мы могли идентифицировать и исправить любые вредоносные инъекции сценария. Для этого вы можете указать браузеру отправить отчет о перехвате в формате JSON по адресу через Директиву отчета-URI.
Контент-безопасность-политика: по умолчанию SRC 'self'; ...;; report-uri /my_amazing_csp_report_parser;
Отчет будет выглядеть так:
{
csp-report: {
Document-Uri:,
Реферат:,
Заблокирован-ури:,
Насильственная направленность: Script-Src 'self' https://apis.google.com,
Original-Policy: Script-Src 'self' https://apis.google.com; Отчет-URI
}
}
Информация, содержащаяся в нем, поможет вам определить ситуацию с блокировкой, в том числе наступающий документ-URI, рефератель страницы, ресурс, который нарушает политику страницы, нарушенную директиву и первоначальную политику всего содержания страницы.
Реалистичное использование
CSP теперь доступен в браузерах Chrome 16+ и Firefox 4+, и ожидается, что он получит ограниченную поддержку на IE10. Safari еще не поддерживается, но ночная сборка Webkit доступна, поэтому ожидается, что Safari будет поддерживаться на итерации ниже.
Давайте посмотрим на некоторые часто используемые варианты использования ниже:
Фактический случай 1: виджет социальных сетей
Кнопка Google +1 включает в себя сценарии от https://apis.google.com, а также iframes, встроенные из https://plusone.google.com. Ваша политика должна включать эти источники для использования кнопки Google+1. Самая простая стратегия-Script-Src https://apis.google.com; Frame-Src https://plusone.google.com. Вы также должны убедиться, что фрагменты JS, предоставленные Google, хранятся во внешних файлах JS.
Есть много решений для реализации для кнопки Facebook Like. Я рекомендую вам придерживаться версии iframe, поскольку она хорошо изолированна от остальной части вашего сайта. Это требует использования директивы Frame-Src https://facebook.com. Обратите внимание, что по умолчанию код iframe, предоставленный Facebook, использует относительный путь //Facebook.com. Пожалуйста, измените этот код на https://facebook.com. В HTTP нет необходимости не использовать.
Кнопка твита Twitter зависит от скрипта и кадра, как от https://platform.twitter.com (Twitter по умолчанию предоставляет относительный URL -адрес, пожалуйста, отредактируйте код при копировании, чтобы указать его как https).
Другие платформы имеют аналогичные ситуации и могут быть решены аналогично. Я рекомендую установить Default-SRC на нет, а затем посмотреть на консоль, чтобы проверить, какие ресурсы вам необходимо использовать, чтобы убедиться, что виджет работает должным образом.
Использование нескольких виджетов очень просто: просто объедините все политические директивы и не забудьте собрать настройки одной и той же директивы вместе. Если вы хотите использовать три вышеуказанные виджеты, стратегия будет выглядеть так:
Script-Src https://apis.google.com https://platform.twitter.com; Frame-Src https://plusone.google.com https://facebook.com https://platform.twitter.com
Фактический случай 2: защита
Предположим, вы посещаете банковский веб -сайт и хотите убедиться, что загружаются только необходимые ресурсы. В этом случае начните настройка разрешения по умолчанию, чтобы заблокировать все (по умолчанию SRC «Нет») и создайте политику с нуля.
Например, сайт банка должен загружать изображения, стили и сценарии из CDN с https://cdn.mybank.net и подключиться к https://api.mybank.com/ до xhr, чтобы получить различные данные. Он также должен использовать кадр, но все кадры-все на местных страницах, не являющихся третьими,. На сайте нет вспышки, шрифтов и другого контента. В этом случае мы можем отправить самый строгий заголовок CSP:
Контент-безопасность-политика: по умолчанию SRC 'none'; Script-Src https://cdn.mybank.net; Style-Src https://cdn.mybank.net; img-src https://cdn.mybank.net; Connect-Src https://api.mybank.com; Frame-src 'self'
Фактический случай 3: используйте только SSL
Администратор на форуме обручального кольца хочет, чтобы все ресурсы были загружены безопасным образом, но не хотят действительно писать слишком много кода; Переписывание большого количества сторонних сценариев и стилей форума не подходит. Таким образом, следующая стратегия будет очень полезна:
Контент-безопасность-политика: по умолчанию https:; Script-Src https: «небезопасно»; Style-Src https: «небезопасно»
Хотя по умолчанию SRC указывает HTTPS, сценарии и стили не унаследованы автоматически. Каждая директива полностью переопределяет тип ресурса по умолчанию.
будущее
Рабочая группа по безопасности веб -приложений W3C разрабатывает подробную информацию о спецификациях политики безопасности контента. Версия 1.0 введет окончательный этап пересмотра, который очень близок к тому, что описано в этой статье. Public-Webappsec@ Email Group обсуждает версию 1.1, и производители браузеров также усердно работают над консолидацией и улучшением реализации CSP.
CSP 1.1 имеет несколько интересных вещей на артборде, которые стоит перечислять отдельно:
Добавление политик с помощью метатеток: предпочтительным способом установления CSP является HTTP -заголовки, что очень полезно, но оно будет более прямым через теги или сценарии, но еще не было завершено. Webkit реализовал функцию настройки разрешения через мета-элементы, поэтому теперь вы можете попробовать следующие настройки в Chrome: добавить <metahttp-equiv = x-webkit-csp content = [Политика идет сюда]> в заголовок документа.
Вы даже можете добавить политики через сценарии во время выполнения.
DOM API: Если эта функция добавлена к следующей итерации CSP, вы можете запросить текущую политику безопасности страницы через JavaScript и настроить ее в соответствии с различными ситуациями. Например, если eval () доступна, реализация вашего кода может немного отличаться. Это очень полезно для автора Framework JS; И спецификация API по -прежнему очень неопределенна, вы можете найти последнюю итерацию в разделе интерфейса скрипта в спецификации.
Новые директивы: обсуждаются многие новые директивы, в том числе сценарии: вставные сценарии могут использоваться только в том случае, если используются явно указанные элементы сценария; Типы плагина: это ограничит тип плагина; Форма-действие: разрешить подавать форму только в конкретный источник.
Если вы заинтересованы в обсуждениях этих будущих функций, вы можете прочитать архив списка рассылки или добавить его в список рассылки.
Эта статья переведена из:
Выдержка из блога Цзян Юджи