aboutsummaryrefslogtreecommitdiff
path: root/files/ru/mozilla/add-ons/webextensions/content_security_policy/index.html
blob: 14c8fbadf8c7d63582654d47642187c840b46ca9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
---
title: Политика защиты содержимого
slug: Mozilla/Add-ons/WebExtensions/Content_Security_Policy
tags:
  - Web-расширение
  - Безопасность
  - Расширение
translation_of: Mozilla/Add-ons/WebExtensions/Content_Security_Policy
---
<div>{{AddonSidebar}}</div>

<div class="summary">
<p>Политика защиты содержимого (англ. Content Security Policy) автоматически применяется ко всем расширениям, разработанным с использованием WebExtension API. Она ограничивает источники, из которых расширение может загружать <a href="/ru/docs/Web/HTML/Element/script">&lt;script&gt;</a> и <a href="/ru/docs/Web/HTML/Element/object">&lt;object&gt;</a> ресурсы, и препятствует потенциально опасным практикам, например использованию <code><a href="/ru/docs/Web/JavaScript/Reference/Global_Objects/eval">eval()</a></code>.</p>

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

<p><a href="/ru/docs/Web/HTTP/CSP">Политика защиты содержимого</a> - это механизм, помогающий веб-сайтам предотвращать выполнение умышленно вредного кода. Веб-сайт устанавливает политику защиты, используя HTTP заголовок, посылаемый с сервера. Главным образом эта политика участвует в устанавливании допустимых источников для загрузки различного вида контента, к примеру, скриптов или встроенных плагинов. Например, веб-сайт может использовать политику защиты для инструктирования браузера, чтобы тот выполнял скрипты, загруженные только с самого сайта, а не из каких-либо других источников. Политика защиты содержимого так же может запретить браузеру использовать потенциально опасные практики, например использование <a href="/ru/docs/Web/JavaScript/Reference/Global_Objects/eval">eval()</a>.</p>

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

<pre class="brush: html">&lt;!DOCTYPE html&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
  &lt;/head&gt;

  &lt;body&gt;

    &lt;!-- Некоторый HTML контент --&gt;

    &lt;!--
      Подключение сторонней библиотеки.
      Смотрите также https://developer.mozilla.org/ru/docs/Web/Security/Subresource_Integrity.
    --&gt;
    &lt;script&gt;
      src="https://code.jquery.com/jquery-2.2.4.js"
      integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI="
      crossorigin="anonymous"&gt;
    &lt;/script&gt;

    &lt;!-- Include my popup's own script--&gt;
    &lt;script src="popup.js"&gt;&lt;/script&gt;
  &lt;/body&gt;

&lt;/html&gt;</pre>

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

<ul>
 <li>довольно строгая политика по защите содержимого применяются изначально. Смотрите <a href="/ru/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy#%D0%98%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BF%D0%BE_%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B5_%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE">изначальные правила по защите содержимого</a>.</li>
 <li>авторы расширений могут изменять изначальную политику, используя <code>content_security_policy</code> ключ в manifest.json, но даже в этом случае существуют  ограничения на возможные разрешения. Для дополнительной информации смотрите <code><a href="/ru/docs/Mozilla/Add-ons/WebExtensions/manifest.json/content_security_policy">content_security_policy</a></code>.</li>
</ul>

<h2 id="Изначальные_правила_по_защите_содержимого">Изначальные правила по защите содержимого</h2>

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

<pre>"script-src 'self'; object-src 'self';"</pre>

<p>Они применяются к любому расширению, которое самостоятельно не указывает свою политику защиты, используя <code><a href="/ru/docs/Mozilla/Add-ons/WebExtensions/manifest.json/content_security_policy">content_security_policy</a></code> ключ в manifest.json. Это имеет следующие последствия:</p>

<ul>
 <li>
  <p><a href="/ru/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy#%D0%A0%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_script_%D0%B8_object_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2">Вы можете загружать только локальные к расширению &lt;script&gt; и &lt;object&gt; ресурсы.</a></p>
 </li>
 <li>
  <p><a href="/ru/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy#eval()_%D0%B8_%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B8%D1%89%D0%B8">Расширению не разрешено выполнять код, представленный в виде JavaScript строк.</a></p>
 </li>
 <li>
  <p><a href="/ru/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy#%D0%92%D1%81%D1%82%D1%80%D0%B0%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9_(inline)_JavaScript">Встраиваемый (inline) JavaScript код не будет выполняться.</a></p>
 </li>
</ul>

<h3 id="Расположение_script_и_object_ресурсов">Расположение script и object ресурсов</h3>

<p>Используя изначальную политику защиты содержимого, вы можете загружать только локальные к расширению <a href="/ru/docs/Web/HTML/Element/script">&lt;script&gt;</a> и <a href="/ru/docs/Web/HTML/Element/object">&lt;object&gt;</a> ресурсы. Например, рассмотрите эту строку из документа расширения:</p>

<pre class="brush: html"> &lt;script src="https://code.jquery.com/jquery-2.2.4.js"&gt;&lt;/script&gt;</pre>

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

<ul>
 <li>
  <p>Скачать этот ресурс, упаковать его в ваше расширение и ссылаться к нему локально.</p>
 </li>
 <li>
  <p>Использовать ключ <code><a href="/ru/docs/Mozilla/Add-ons/WebExtensions/manifest.json/content_security_policy">content_security_policy</a></code> в manifest.json, чтобы позволить загрузку контента из вышеупомянутого источника..</p>
 </li>
</ul>

<h3 id="eval()_и_товарищи">eval() и товарищи</h3>

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

<pre class="brush: js">eval("console.log('some output');");</pre>

<pre class="brush: js">window.setTimeout("alert('Hello World!');", 500);</pre>

<pre class="brush: js">var f = new Function("console.log('foo');");</pre>

<h3 id="Встраиваемый_(inline)_JavaScript">Встраиваемый (inline) JavaScript</h3>

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

<pre class="brush: html">&lt;script&gt;console.log("foo");&lt;/script&gt;</pre>

<pre class="brush: html">&lt;div onclick="console.log('click')"&gt;Click me!&lt;/div&gt;</pre>

<p>Вместо того, чтобы использовать код <code>&lt;body onload="main()"&gt;</code> для запуска вашего скрипта после загрузки страницы, поставьте обработчики событий на <a href="/ru/docs/Web/Events/DOMContentLoaded">DOMContentLoaded</a> или <a href="/ru/docs/Web/Events/load">load</a>.</p>