W konsoli programisty pojawia się mnóstwo błędów:
Odmowa oceny ciągu
Odmowa wykonania skryptu wbudowanego, ponieważ narusza następującą dyrektywę dotyczącą zasad bezpieczeństwa treści
Odmowa załadowania skryptu
Odmowa załadowania arkusza stylów
O co w tym wszystkim chodzi? Jak działa Polityka bezpieczeństwa treści? Jak korzystać z Content-Security-Policy
nagłówka HTTP?
W szczególności, jak ...
- ... zezwalać na wiele źródeł?
- ... użyć różnych dyrektyw?
- ... użyć wielu dyrektyw?
- ... obsłużyć porty?
- ... obsługiwać różne protokoły?
- ... zezwolić na
file://
protokół? - ... używać wbudowanych stylów, skryptów i tagów
<style>
oraz<script>
? - ... pozwolić
eval()
?
I w końcu:
- Co dokładnie
'self'
znaczy?
Odpowiedzi:
Content-Security-Policy
Meta-tag pozwala zmniejszyć ryzyko XSS ataków, pozwalając na określenie, gdzie zasoby mogą być ładowane z zapobiegając przeglądarkami ładowania danych z innych lokalizacjach. Utrudnia to atakującemu wstrzyknięcie złośliwego kodu do Twojej witryny.Uderzyłem głową w ścianę z cegły, próbując zrozumieć, dlaczego popełniam błędy CSP jeden po drugim, i wydawało się, że nie było żadnych zwięzłych, jasnych instrukcji, jak to działa. Oto moja krótka próba wyjaśnienia niektórych punktów CSP, głównie skoncentrowana na rzeczach, które trudno mi rozwiązać.
Dla zwięzłości nie napiszę pełnego tagu w każdej próbce. Zamiast tego pokażę tylko
content
właściwość, więc przykład, który mówi,content="default-src 'self'"
oznacza to:1. Jak zezwolić na wiele źródeł?
Możesz po prostu wymienić swoje źródła po dyrektywie jako listę oddzieloną spacjami:
Zauważ, że nie ma cudzysłowu wokół parametrów innych niż specjalne , takich jak
'self'
. Ponadto:
po dyrektywie nie ma dwukropka ( ). Tylko dyrektywa, a następnie rozdzielona spacjami lista parametrów.Wszystko poniżej określonych parametrów jest domyślnie dozwolone. Oznacza to, że w powyższym przykładzie byłyby to prawidłowe źródła:
Te nie byłyby jednak ważne:
2. Jak korzystać z różnych dyrektyw, co one robią?
Najczęstsze dyrektywy to:
default-src
domyślne zasady ładowania javascript, obrazów, CSS, czcionek, żądań AJAX itpscript-src
określa prawidłowe źródła plików javascriptstyle-src
określa prawidłowe źródła plików cssimg-src
określa prawidłowe źródła obrazówconnect-src
określa prawidłowe cele dla XMLHttpRequest (AJAX), WebSockets lub EventSource. Jeśli nastąpi próba połączenia z hostem, który nie jest tutaj dozwolony, przeglądarka wyemituje400
błądSą inne, ale te są najbardziej potrzebne.
3. Jak korzystać z wielu dyrektyw?
Wszystkie dyrektywy definiuje się w ramach jednego metatagu, kończąc je średnikiem (
;
):4. Jak obsługiwać porty?
Wszystko oprócz domyślnych portów musi być jawnie dozwolone poprzez dodanie numeru portu lub gwiazdki po dozwolonej domenie:
Powyższe spowodowałoby:
Jak wspomniałem, możesz również użyć gwiazdki, aby jawnie zezwolić na wszystkie porty:
5. Jak obsługiwać różne protokoły?
Domyślnie dozwolone są tylko standardowe protokoły. Na przykład, aby zezwolić na WebSockets
ws://
, musisz zezwolić na to jawnie:6. Jak zezwolić na protokół plików
file://
?Jeśli spróbujesz zdefiniować to jako takie, to nie zadziała. Zamiast tego zezwolisz na to za pomocą
filesystem
parametru:7. Jak korzystać ze skryptów wbudowanych i definicji stylów?
O ile nie jest to wyraźnie dozwolone, nie można używać wbudowanych definicji stylów, kodu wewnątrz
<script>
tagów ani właściwości tagów, takich jakonclick
. Pozwalacie im tak:Musisz także wyraźnie zezwolić na wstawianie obrazów zakodowanych w standardzie base64:
8. Jak pozwolić
eval()
?Jestem pewien, że wiele osób powiedziałoby, że nie, ponieważ „ewolucja jest złem” i najprawdopodobniej przyczyną zbliżającego się końca świata. Ci ludzie by się mylili. Oczywiście, możesz zdecydowanie wykopać poważne dziury w bezpieczeństwie swojej witryny za pomocą eval, ale ma ona całkowicie uzasadnione przypadki użycia. Musisz tylko być mądrym w używaniu go. Pozwalasz na to tak:
9. Co dokładnie
'self'
oznacza?Możesz przez to
'self'
rozumieć localhost, lokalny system plików lub cokolwiek na tym samym hoście. To nic nie znaczy. 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 treści. Czy udostępniasz swoją witrynę przez HTTP? Nie ma dla ciebie https, chyba że wyraźnie go zdefiniujesz.Użyłem
'self'
w większości przykładów, ponieważ zwykle ma sens włączenie go, ale w żadnym wypadku nie jest to obowiązkowe. Zostaw to, jeśli nie potrzebujesz.Ale poczekaj chwilę! Czy nie mogę po prostu
content="default-src *"
z niego korzystać?Nie. Oprócz oczywistych luk w zabezpieczeniach to również nie zadziała, jak można się spodziewać. Mimo że niektórzy doktorzy twierdzą, że na to pozwala cokolwiek, to nieprawda. Nie pozwala na wstawianie ani sprawdzanie poprawności, więc aby naprawdę, naprawdę uczynić twoją witrynę bardziej podatną na atak, możesz użyć tego:
... ale ufam, że nie.
Dalsza lektura:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
źródło
default-src *; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'; img-src * data: 'unsafe-inline'; connect-src * 'unsafe-inline'; frame-src *;
content="default-src * 'unsafe-inline' 'unsafe-eval'"
jest to konieczne, aby niektóre aplikacje Angular działały.connect-src
i ścieżek: końcowe ukośniki są obowiązkowe, jeśli chcesz dołączyć całą podścieżkę. Np .: plikhttp://foo.com/files/bar.txt
zostanie zablokowany, jeśli źródło jesthttp://foo.com/files
, ale zostanie udostępnione , gdy jesthttp://foo.com/files/
APACHE2 MOD_HEADERS
Możesz także włączyć Apache2 mod_headers, na Fedorze jest już domyślnie włączony, jeśli używasz Ubuntu / Debian, włącz to w następujący sposób:
W Ubuntu / Debian możesz skonfigurować nagłówki w pliku
/etc/apache2/conf-enabled/security.conf
Uwaga: To jest dolna część pliku, tylko 3 ostatnie wpisy to ustawienia CSP.
Pierwszy parametr to dyrektywa, drugi to źródła, które należy umieścić na białej liście. Dodałem Google Analytics i serwer reklam, który możesz mieć. Ponadto odkryłem, że jeśli masz aliasy, np. Www.example.com i example.com skonfigurowane w Apache2, powinieneś dodać je również do białej listy.
Kod wewnętrzny jest uważany za szkodliwy, należy go unikać. Skopiuj wszystkie javascripts i css do osobnych plików i dodaj je do białej listy.
W tym momencie możesz rzucić okiem na inne ustawienia nagłówka i zainstalować mod_security
Dalsza lektura:
https://developers.google.com/web/fundamentals/security/csp/
https://www.w3.org/TR/CSP/
źródło
Nie zapomnij o font-src, który działa tak samo jak każdy inny, ale jeśli używasz czcionek załadowanych z innego źródła - upewnij się, że dodałeś go do metatagu
źródło