Jak działa polityka bezpieczeństwa treści?

Dostaję kilka błędów w konsoli dewelopera:

Odmowa oceny ciągu

Odmówiono wykonania skryptu inline, ponieważ narusza on następującą dyrektywę Content Security Policy

Odmowa wczytania skryptu

Odmowa załadowania arkusza stylów

O co w tym wszystkim chodzi? Jak działa polityka bezpieczeństwa treści? Jak używać nagłówka Content-Security-Policy HTTP? W szczególności, jak...
  1. ...Zezwalaj wiele źródeł?
  2. ...użyć różnych dyrektyw?
  3. ...użyć wielu dyrektyw?
  4. ...obsługiwać porty?
  5. ...obsługiwać różne protokoły?
  6. ...zezwolić file:// protokołowi?
  7. ...używać stylów inline, skryptów i tagów <style> i <script>?
  8. ...pozwolić eval()?

I wreszcie:

  1. co dokładnie oznacza 'self'?
Author: Michał Perłakowski, 2015-05-16

2 answers

Meta-tag Content-Security-Policy pozwala zmniejszyć ryzyko atakówXSS , pozwalając określić, skąd zasoby mogą być ładowane, uniemożliwiając przeglądarkom ładowanie danych z innych lokalizacji. Utrudnia to atakującemu wprowadzenie złośliwego kodu do witryny.

Uderzyłem głową w ceglaną ścianę, próbując dowiedzieć się, dlaczego dostawałem błędy CSP jeden po drugim, i nie wydawało się, aby były jakieś zwięzłe, jasne instrukcje, jak to działa. Więc oto moja próba wyjaśnienianiektórych punktów CSP krótko, koncentrując się głównie na rzeczach, które uważam za trudne do rozwiązania.

Dla zwięzłości Nie będę pisać pełnego tagu w każdej próbce. Zamiast tego pokażę tylko właściwość content, więc próbka, która mówi content="default-src 'self'" oznacza to:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

1. Jak zezwolić na wiele źródeł?

Możesz po prostu wypisać swoje źródła po dyrektywie jako listę rozdzieloną spacjami:

content="default-src 'self' https://example.com/js/"

Zauważ, że nie ma cudzysłowów wokół parametry inne niż specjalne , takie jak 'self'. Poza tym nie ma dwukropka (:) po dyrektywie. Tylko dyrektywa, a następnie oddzielona spacjami lista parametrów.

Wszystko poniżej podanych parametrów jest domyślnie dozwolone. Oznacza to, że w powyższym przykładzie będą to ważne źródła: {]}

https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js

Te jednak nie będą ważne:

http://example.com/js/file.js
^^^^ wrong protocol

https://example.com/file.js
                   ^^ above the specified path

2. Jak korzystać z różnych dyrektyw, co każdy z nich robi?

Najbardziej wspólne dyrektywy to:

  • default-src domyślna Polityka ładowania javascript, obrazów, CSS, czcionek, żądań AJAX, itp
  • script-src definiuje poprawne źródła dla plików javascript
  • style-src definiuje poprawne źródła dla plików css
  • img-src definiuje poprawne źródła obrazów
  • connect-src definiuje poprawne cele dla XMLHttpRequest( AJAX), WebSockets lub EventSource. Jeśli zostanie podjęta próba połączenia z hostem, który nie jest tu dozwolony, przeglądarka emuluje 400 błąd
Są inne, ale te są najbardziej potrzebne.

3. Jak korzystać z wielu dyrektyw?

Definiujesz wszystkie dyrektywy wewnątrz jednego meta-tagu, kończąc je średnikiem (;):

content="default-src 'self' https://example.com/js/; style-src 'self'"

4. Jak obsługiwać porty?

[36]} Wszystko oprócz domyślnych portów musi być dozwolone poprzez dodanie numeru portu lub gwiazdki po dozwolonej domenie:
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"

The powyższe skutkowałoby:

https://ajax.googleapis.com:123
                           ^^^^ Not ok, wrong port

https://ajax.googleapis.com - OK

http://example.com/free/stuff/file.js
                 ^^ Not ok, only the port 123 is allowed

http://example.com:123/free/stuff/file.js - OK

Jak wspomniałem, możesz również użyć gwiazdki, aby wyraźnie zezwolić wszystkim portom: {]}

content="default-src example.com:*"

5. Jak obsługiwać różne protokoły?

Domyślnie dozwolone są tylko standardowe protokoły. Na przykład, aby zezwolić WebSockets ws://, musisz zezwolić na to jawnie:

content="default-src 'self'; connect-src ws:; style-src 'self'"
                                         ^^^ web sockets are now allowed on all domains and ports

6. Jak zezwolić na protokół plików file://?

Jeśli spróbujesz zdefiniować to jako takie, to nie zadziała. Zamiast tego, pozwolicie na to z filesystem parametr:

content="default-src filesystem"

7. Jak używać wbudowanych skryptów i definicji stylów?

O ile wyraźnie nie jest to dozwolone, nie można używać definicji stylu w wierszu, kodu wewnątrz znaczników <script> ani we właściwościach znaczników, takich jak onclick. Pozwalasz im tak:

content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"

Będziesz musiał również jawnie zezwolić na wbudowane, zakodowane obrazy base64:

content="img-src data:"

8. Jak pozwolić eval()?

Jestem pewien, że wiele osób powie, że nie, ponieważ "eval jest zły" i najprawdopodobniej przyczyną zbliżającego się końca świata. Ci ludzie by się mylili. Oczywiście, możesz zdecydowanie wybić poważne dziury w zabezpieczeniach swojej witryny za pomocą eval, ale ma to doskonale uzasadnione przypadki użycia. Po prostu trzeba być mądrym, żeby go używać. Pozwalasz na to tak:

content="script-src 'unsafe-eval'"

9. Co dokładnie oznacza 'self'?

Można przyjąć, że 'self' oznacza localhost, lokalny system plików lub cokolwiek na tym samym hoście. To nie znaczy nic z tych rzeczy. Oznacza źródła, które mają ten sam schemat (protokół), ten sam host i ten sam port co plik, w którym zdefiniowana jest polityka zawartości. Serwowanie witryny przez HTTP? Wtedy nie będzie dla Ciebie https, chyba że zdefiniujesz go jawnie.

Użyłem 'self' w większości przykładów, ponieważ zwykle ma to sens, ale nie jest to obowiązkowe. Zostaw to, jeśli nie potrzebujesz.

Ale poczekaj chwilę! nie mogę po prostu użyć content="default-src *" i skończyć z tym?

Nie. Oprócz oczywistych luk w zabezpieczeniach, to pozostawi to również nie będzie działać, jak można się spodziewać. Mimo że niektóre dokumenty twierdzą, że pozwala na wszystko, to nieprawda. Nie pozwala to na inlining ani ewaluację, więc aby naprawdę, naprawdę uczynić Twoją witrynę wyjątkowo podatną na ataki, użyłbyś tego: {]}
content="default-src * 'unsafe-inline' 'unsafe-eval'"

... ale ufam, że tego nie zrobisz.]}

Czytaj dalej:

Http://content-security-policy.com

Http://en.wikipedia.org/wiki/Content_Security_Policy

 386
Author: Schlaus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-01 15:27:01

APACHE2 MOD_HEADERS

Możesz również włączyć apache2 mod_headers, na Fedorze jest już domyślnie włączona, jeśli używasz Ubuntu/Debiana włącz to w następujący sposób:
# First enable headers module for Apache2, 
# then restart the Apache2 service   
a2enmod headers
apache2 -k graceful

Na Ubuntu / Debianie można skonfigurować nagłówki w pliku /etc/apache2/conf-enabled/security.conf

#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
# 
#Header set X-Content-Type-Options: "nosniff"

#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
Header always set X-Frame-Options: "sameorigin"
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Permitted-Cross-Domain-Policies "master-only"
Header always set Cache-Control "no-cache, no-store, must-revalidate"
Header always set Pragma "no-cache"
Header always set Expires "-1"
Header always set Content-Security-Policy: "default-src 'none';"
Header always set Content-Security-Policy: "script-src 'self' www.google-analytics.com adserver.example.com www.example.com;"
Header always set Content-Security-Policy: "style-src 'self' www.example.com;"

Uwaga: Jest to dolna część pliku, tylko Ostatnie 3 wpisy są ustawieniami CSP.

Pierwszy parametr to dyrektywa, drugi to źródła, które mają być wymienione na białej liście. Dodałem Google analytics i adserver, który możesz mieć. Ponadto stwierdziłem, że jeśli masz pseudonimy, np. www.example.com oraz example.com jeśli chcesz dowiedzieć się więcej o naszej ofercie, zapraszamy do zapoznania się z naszą ofertą.

Kod Inline jest uważany za szkodliwy, należy go unikać. Skopiuj wszystkie skrypty javascripts i css do oddzielnych plików i dodaj je do białej listy.

W tym momencie możesz spojrzeć na inne ustawienia nagłówka i zainstalować mod_security

Dalsze czytanie:

Https://developers.google.com/web/fundamentals/security/csp/

Https://www.w3.org/TR/CSP/

 10
Author: Erik Hendriks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 17:20:53