From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../content_security_policy/index.html | 111 +++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 files/ru/mozilla/add-ons/webextensions/content_security_policy/index.html (limited to 'files/ru/mozilla/add-ons/webextensions/content_security_policy') diff --git a/files/ru/mozilla/add-ons/webextensions/content_security_policy/index.html b/files/ru/mozilla/add-ons/webextensions/content_security_policy/index.html new file mode 100644 index 0000000000..2a620b3a39 --- /dev/null +++ b/files/ru/mozilla/add-ons/webextensions/content_security_policy/index.html @@ -0,0 +1,111 @@ +--- +title: Политика защиты содержимого +slug: Mozilla/Add-ons/WebExtensions/Content_Security_Policy +tags: + - Web-расширение + - Безопасность + - Расширение +translation_of: Mozilla/Add-ons/WebExtensions/Content_Security_Policy +--- +
{{AddonSidebar}}
+ +
+

Политика защиты содержимого (англ. Content Security Policy) автоматически применяется ко всем расширениям, разработанным с использованием WebExtension API. Она ограничивает источники, из которых расширение может загружать <script> и <object> ресурсы, и препятствует потенциально опасным практикам, например использованию eval().

+ +

Статья в краткой форме объясняет значимость этой политики, каковы её изначальные правила, как они влияют на расширение, и как расширение может изменять эти правила.

+
+ +

Политика защиты содержимого - это механизм, помогающий веб-сайтам предотвращать выполнение умышленно вредного кода. Веб-сайт устанавливает политику защиты, используя HTTP заголовок, посылаемый с сервера. Главным образом эта политика участвует в устанавливании допустимых источников для загрузки различного вида контента, к примеру, скриптов или встроенных плагинов. Например, веб-сайт может использовать политику защиты для инструктирования браузера, чтобы тот выполнял скрипты, загруженные только с самого сайта, а не из каких-либо других источников. Политика защиты содержимого так же может запретить браузеру использовать потенциально опасные практики, например использование eval().

+ +

Так же как веб-сайты, расширения могут загружать контент из различных источников. Например, всплывающее окно расширения определяется HTML документом, и может подключать JavaScript и CSS файлы из различных источников, точно так же, как и нормальная веб-страница:

+ +
<!DOCTYPE html>
+
+<html>
+  <head>
+    <meta charset="utf-8">
+  </head>
+
+  <body>
+
+    <!-- Некоторый HTML контент -->
+
+    <!--
+      Подключение сторонней библиотеки.
+      Смотрите так же https://developer.mozilla.org/ru/docs/Web/Security/Subresource_Integrity.
+    -->
+    <script>
+      src="https://code.jquery.com/jquery-2.2.4.js"
+      integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI="
+      crossorigin="anonymous">
+    </script>
+
+    <!-- Include my popup's own script-->
+    <script src="popup.js"></script>
+  </body>
+
+</html>
+ +

В сравнении с веб-сайтами, расширения имеют доступ к дополнительному привилегированному API, так что вероятность получения к нему доступа сторонним кодом - это очень большой риск. По этой причине:

+ + + +

Изначальные правила по защите содержимого

+ +

Следующие правила по защите содержимого являются изначальными:

+ +
"script-src 'self'; object-src 'self';"
+ +

Они применяются к любому расширению, которое самостоятельно не указывает свою политику защиты, используя content_security_policy ключ в manifest.json. Это имеет следующие последствия:

+ + + +

Расположение script и object ресурсов

+ +

Используя изначальную политику защиты содержимого, вы можете загружать только локальные к расширению <script> и <object> ресурсы. Например, рассмотрите эту строку из документа расширения:

+ +
 <script src="https://code.jquery.com/jquery-2.2.4.js"></script>
+ +

Она не будет загружать запрашиваемый ресурс, и вы не сможете найти ни один ожидаемый от ресурса объект. К этой ситуации существует два решения:

+ + + +

eval() и товарищи

+ +

Изначальная политика защиты содержимого не позволяет выполнять код из JavaScript строк. Это означает, что следующие примеры кода изначально запрещены:

+ +
eval("console.log('some output');");
+ +
window.setTimeout("alert('Hello World!');", 500);
+ +
var f = new Function("console.log('foo');");
+ +

Встраиваемый (inline) JavaScript

+ +

Изначальная политика защиты содержимого не позволяет выполнять JavaScript код, встраиваемый в HTML теги. Это запрещает как выполнение JavaScript кода вложенного прямо в <script> тег, так и выполнение вписанных в атрибут обработчиков событий, означая, что следующий код так же не будет работать:

+ +
<script>console.log("foo");</script>
+ +
<div onclick="console.log('click')">Click me!</div>
+ +

Вместо того, чтобы использовать код <body onload="main()"> для запуска вашего скрипта после загрузки страницы, поставьте обработчики событий на DOMContentLoaded или load.

-- cgit v1.2.3-54-g00ecf