Tylko uwaga, że to nie rozwiąże przypadku, w którym możesz chcieć użyć danych wejściowych użytkownika jako atrybutu HTML. Na przykład źródłowy adres URL obrazu. Nie jest to częsty przypadek, ale łatwy do zapomnienia.
@TimTim: W większości przypadków tak. Jednak gdy chcesz zezwolić na wprowadzanie HTML, sprawy stają się nieco trudniejsze, a jeśli tak, to polecam użyć czegoś takiego jak htmlpurifier.org
Alix Axel
@Alix Axel, więc czy twoja odpowiedź na użycie htmlspecialchars lub htmlpurifier.org ?
TimTim
3
Jeśli chcesz zaakceptować wprowadzanie HTML, użyj HTML Purifier, jeśli nie, użyj htmlspecialchars().
W większości przypadków jest to poprawne, ale nie jest tak proste. Powinieneś rozważyć umieszczenie niezaufanego łańcucha w HTML, Js, Css i rozważyć umieszczenie niezaufanego HTML w HTML. Spójrz na to: owasp.org/index.php/...
brązu człowieka
41
Jednym z moich ulubionych odniesień do OWASP jest wyjaśnienie dotyczące skryptów krzyżowych, ponieważ chociaż istnieje wiele wektorów ataku XSS, przestrzeganie kilku reguł może obronić się przed większością z nich!
Jednym z najważniejszych kroków jest oczyszczenie danych wejściowych użytkownika przed ich przetworzeniem i / lub renderowaniem z powrotem do przeglądarki. PHP ma kilka funkcji „ filtrowania ”, których można użyć.
Formą, jaką zwykle mają ataki XSS, jest wstawienie linku do jakiegoś zewnętrznego javascript, który zawiera szkodliwe zamiary dla użytkownika. Przeczytaj więcej na ten temat tutaj .
Będziesz także chciał przetestować swoją witrynę - mogę polecić dodatek Firefox XSS Me .
Czego potrzebuję, aby dokładnie zdezynfekować dane wejściowe. Czy jest jakiś konkretny znak / ciąg, na który muszę uważać?
TimTim
27
@TimTim - nie. Wszystkie dane wejściowe użytkownika powinny być zawsze uważane za wrogo nastawione.
zombat
Poza tym dane wewnętrzne (pracownicy, sysadmin itp.) Mogą być niebezpieczne. Należy identyfikować i monitorować (z datą rejestracji i użytkownikiem) dane wyświetlane z interpretacją.
Samuel Dauzon,
9
W kolejności preferencji:
Jeśli używasz silnika szablonów (np. Twig, Smarty, Blade), sprawdź, czy umożliwia on ucieczkę kontekstową. Wiem z doświadczenia, że robi to Twig.{{ var|e('html_attr') }}
Jeśli chcesz zezwolić na HTML, użyj HTML Purifier . Nawet jeśli uważasz, że akceptujesz tylko Markdown lub ReStructuredText, nadal chcesz oczyścić HTML z wyjściowych języków znaczników.
W przeciwnym razie użyj htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)i upewnij się, że reszta dokumentu używa tego samego zestawu znaków jak $charset. W większości przypadków 'UTF-8'jest pożądanym zestawem znaków.
Publikowanie tego jako skonsolidowanego odniesienia z wersji beta Dokumentacji SO, która przechodzi w tryb offline.
Problem
Skrypty między witrynami to niezamierzone wykonanie zdalnego kodu przez klienta WWW. Każda aplikacja internetowa może narazić się na XSS, jeśli pobierze dane wejściowe od użytkownika i wyśle je bezpośrednio na stronie internetowej. Jeśli dane wejściowe obejmują HTML lub JavaScript, zdalny kod może zostać wykonany, gdy treść ta jest renderowana przez klienta WWW.
Na przykład, jeśli strona zewnętrzna zawiera plik JavaScript:
Uruchomiony zostanie skrypt JavaScript innej firmy, a użytkownik zobaczy „Uruchomię” na stronie internetowej.
Rozwiązanie
Zasadniczo nigdy nie ufaj wkładowi pochodzącemu od klienta. Każda wartość GET, POST i cookie może być dowolną wartością, dlatego należy ją zweryfikować. Kiedy wypisujesz którąś z tych wartości, unikaj ich, aby nie zostały ocenione w nieoczekiwany sposób.
Należy pamiętać, że nawet w najprostszych aplikacjach dane można przenosić i trudno będzie śledzić wszystkie źródła. Dlatego najlepszą praktyką jest zawsze unikanie wyjścia.
PHP oferuje kilka sposobów na uniknięcie wyjścia w zależności od kontekstu.
htmlspecialcharsprzekonwertuje żadnych „znaków szczególnych html” w ich kodowania HTML, co oznacza, że wtedy nie być przetwarzane w standardzie HTML. Aby naprawić nasz poprzedni przykład przy użyciu tej metody:
<?php
echo '<div>'. htmlspecialchars($_GET['input']).'</div>';// or
echo '<div>'. filter_input(INPUT_GET,'input', FILTER_SANITIZE_SPECIAL_CHARS).'</div>';
Wszystko wewnątrz <div>znacznika nie będzie interpretowane przez przeglądarkę jako znacznik JavaScript, ale jako zwykły węzeł tekstowy. Użytkownik bezpiecznie zobaczy:
Podczas generowania dynamicznie generowanego adresu URL PHP zapewnia urlencodefunkcję bezpiecznego generowania prawidłowych adresów URL. Na przykład jeśli użytkownik jest w stanie wprowadzić dane, które stają się częścią innego parametru GET:
Wszelkie złośliwe dane wejściowe zostaną przekonwertowane na zakodowany parametr adresu URL.
Korzystanie ze specjalistycznych bibliotek zewnętrznych lub list OWASP AntiSamy
Czasami będziesz chciał wysłać HTML lub inny rodzaj kodu. Będziesz musiał prowadzić listę autoryzowanych słów (biała lista) i nieautoryzowanych (czarna lista).
Możesz pobrać standardowe listy dostępne na stronie OWASP AntiSamy . Każda lista nadaje się do określonego rodzaju interakcji (eBay api, tinyMCE itp.). I to jest open source.
Istnieją biblioteki, które filtrują HTML i zapobiegają atakom XSS w ogólnym przypadku i wykonują co najmniej tak samo dobrze, jak listy AntiSamy z bardzo łatwą obsługą. Na przykład masz HTML Purifier
Wiele platform pomaga obsługiwać XSS na różne sposoby. Podczas toczenia własnego lub jeśli istnieje problem z XSS, możemy wykorzystać filter_input_array (dostępny w PHP 5> = 5.2.0, PHP 7.) Zazwyczaj dodam ten fragment kodu do mojego SessionController, ponieważ wszystkie wywołania przechodzą tam przed jakimkolwiek innym kontrolerem współdziała z danymi. W ten sposób wszystkie dane wejściowe użytkownika są dezynfekowane w 1 centralnej lokalizacji. Jeśli dzieje się tak na początku projektu lub przed zatruciem bazy danych, nie powinieneś mieć żadnych problemów w momencie wyjścia ... zatrzymuje zatrzymywanie śmieci, usuwanie śmieci.
/* Prevent XSS input */
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);/* I prefer not to use $_REQUEST...but for those who do: */
$_REQUEST =(array)$_POST +(array)$_GET +(array)$_REQUEST;
Powyższe spowoduje usunięcie WSZYSTKICH tagów HTML i skryptów. Jeśli potrzebujesz rozwiązania, które pozwala na bezpieczne tagi, oparte na białej liście, sprawdź HTML Purifier .
Jeśli twoja baza danych jest już zatruta lub chcesz poradzić sobie z XSS w momencie wyjścia, OWASP zaleca utworzenie niestandardowej funkcji opakowania dla echoi używanie jej WSZĘDZIE, gdzie wypisujesz wartości dostarczone przez użytkownika:
Możesz również ustawić niektóre nagłówki odpowiedzi HTTP związane z XSS za pośrednictwem header(...)
Ochrona X-XSS „1; mode = block”
dla pewności włączony jest tryb ochrony XSS przeglądarki.
Polityka bezpieczeństwa treści „default-src„ self ”; ...”
aby włączyć zabezpieczenia treści po stronie przeglądarki. Zobacz ten, aby uzyskać szczegółowe informacje na temat zasad bezpieczeństwa treści (CSP): http://content-security-policy.com/
Zwłaszcza skonfigurowanie CSP do blokowania skryptów wbudowanych i zewnętrznych źródeł skryptów jest pomocne w przypadku XSS.
Oczywiście staraj się unikać eval(var), jeśli musisz użyć któregoś z nich, spróbuj JS, unikając ich, HTML uciec i być może będziesz musiał zrobić coś więcej, ale dla podstaw powinno to wystarczyć.
href
lubsrc
atrybut HTML: stackoverflow.com/questions/19047119/…Odpowiedzi:
Zasadniczo musisz użyć tej funkcji,
htmlspecialchars()
gdy chcesz wypisać coś do przeglądarki, które pochodzi z danych wprowadzonych przez użytkownika.Prawidłowy sposób korzystania z tej funkcji jest mniej więcej taki:
Google Code University ma również te bardzo edukacyjne filmy na temat bezpieczeństwa w sieci:
How To Break Software Web - spojrzenie na luki w zabezpieczeniach oprogramowania sieciowego
Co każdy inżynier musi wiedzieć o bezpieczeństwie i gdzie się go uczyć
źródło
htmlspecialchars()
.Jednym z moich ulubionych odniesień do OWASP jest wyjaśnienie dotyczące skryptów krzyżowych, ponieważ chociaż istnieje wiele wektorów ataku XSS, przestrzeganie kilku reguł może obronić się przed większością z nich!
To jest ściągawka PHP Security
źródło
Jednym z najważniejszych kroków jest oczyszczenie danych wejściowych użytkownika przed ich przetworzeniem i / lub renderowaniem z powrotem do przeglądarki. PHP ma kilka funkcji „ filtrowania ”, których można użyć.
Formą, jaką zwykle mają ataki XSS, jest wstawienie linku do jakiegoś zewnętrznego javascript, który zawiera szkodliwe zamiary dla użytkownika. Przeczytaj więcej na ten temat tutaj .
Będziesz także chciał przetestować swoją witrynę - mogę polecić dodatek Firefox XSS Me .
źródło
W kolejności preferencji:
{{ var|e('html_attr') }}
htmlentities($var, ENT_QUOTES | ENT_HTML5, $charset)
i upewnij się, że reszta dokumentu używa tego samego zestawu znaków jak$charset
. W większości przypadków'UTF-8'
jest pożądanym zestawem znaków.Upewnij się także, że uciekasz na wyjściu, a nie na wejściu .
źródło
Publikowanie tego jako skonsolidowanego odniesienia z wersji beta Dokumentacji SO, która przechodzi w tryb offline.
Problem
Skrypty między witrynami to niezamierzone wykonanie zdalnego kodu przez klienta WWW. Każda aplikacja internetowa może narazić się na XSS, jeśli pobierze dane wejściowe od użytkownika i wyśle je bezpośrednio na stronie internetowej. Jeśli dane wejściowe obejmują HTML lub JavaScript, zdalny kod może zostać wykonany, gdy treść ta jest renderowana przez klienta WWW.
Na przykład, jeśli strona zewnętrzna zawiera plik JavaScript:
A aplikacja PHP bezpośrednio przekazuje ciąg znaków do niej przekazany:
Jeśli niezaznaczony parametr GET zawiera,
<script src="http://example.com/runme.js"></script>
dane wyjściowe skryptu PHP będą następujące:Uruchomiony zostanie skrypt JavaScript innej firmy, a użytkownik zobaczy „Uruchomię” na stronie internetowej.
Rozwiązanie
Zasadniczo nigdy nie ufaj wkładowi pochodzącemu od klienta. Każda wartość GET, POST i cookie może być dowolną wartością, dlatego należy ją zweryfikować. Kiedy wypisujesz którąś z tych wartości, unikaj ich, aby nie zostały ocenione w nieoczekiwany sposób.
Należy pamiętać, że nawet w najprostszych aplikacjach dane można przenosić i trudno będzie śledzić wszystkie źródła. Dlatego najlepszą praktyką jest zawsze unikanie wyjścia.
PHP oferuje kilka sposobów na uniknięcie wyjścia w zależności od kontekstu.
Funkcje filtrów
Funkcje filtrowania PHP pozwalają na dezynfekcję lub walidację danych wejściowych do skryptu php na wiele sposobów . Są przydatne podczas zapisywania lub wysyłania danych wejściowych klienta.
Kodowanie HTML
htmlspecialchars
przekonwertuje żadnych „znaków szczególnych html” w ich kodowania HTML, co oznacza, że wtedy nie być przetwarzane w standardzie HTML. Aby naprawić nasz poprzedni przykład przy użyciu tej metody:Wyprowadziłby:
Wszystko wewnątrz
<div>
znacznika nie będzie interpretowane przez przeglądarkę jako znacznik JavaScript, ale jako zwykły węzeł tekstowy. Użytkownik bezpiecznie zobaczy:Kodowanie URL
Podczas generowania dynamicznie generowanego adresu URL PHP zapewnia
urlencode
funkcję bezpiecznego generowania prawidłowych adresów URL. Na przykład jeśli użytkownik jest w stanie wprowadzić dane, które stają się częścią innego parametru GET:Wszelkie złośliwe dane wejściowe zostaną przekonwertowane na zakodowany parametr adresu URL.
Korzystanie ze specjalistycznych bibliotek zewnętrznych lub list OWASP AntiSamy
Czasami będziesz chciał wysłać HTML lub inny rodzaj kodu. Będziesz musiał prowadzić listę autoryzowanych słów (biała lista) i nieautoryzowanych (czarna lista).
Możesz pobrać standardowe listy dostępne na stronie OWASP AntiSamy . Każda lista nadaje się do określonego rodzaju interakcji (eBay api, tinyMCE itp.). I to jest open source.
Istnieją biblioteki, które filtrują HTML i zapobiegają atakom XSS w ogólnym przypadku i wykonują co najmniej tak samo dobrze, jak listy AntiSamy z bardzo łatwą obsługą. Na przykład masz HTML Purifier
źródło
Wiele platform pomaga obsługiwać XSS na różne sposoby. Podczas toczenia własnego lub jeśli istnieje problem z XSS, możemy wykorzystać filter_input_array (dostępny w PHP 5> = 5.2.0, PHP 7.) Zazwyczaj dodam ten fragment kodu do mojego SessionController, ponieważ wszystkie wywołania przechodzą tam przed jakimkolwiek innym kontrolerem współdziała z danymi. W ten sposób wszystkie dane wejściowe użytkownika są dezynfekowane w 1 centralnej lokalizacji. Jeśli dzieje się tak na początku projektu lub przed zatruciem bazy danych, nie powinieneś mieć żadnych problemów w momencie wyjścia ... zatrzymuje zatrzymywanie śmieci, usuwanie śmieci.
Powyższe spowoduje usunięcie WSZYSTKICH tagów HTML i skryptów. Jeśli potrzebujesz rozwiązania, które pozwala na bezpieczne tagi, oparte na białej liście, sprawdź HTML Purifier .
Jeśli twoja baza danych jest już zatruta lub chcesz poradzić sobie z XSS w momencie wyjścia, OWASP zaleca utworzenie niestandardowej funkcji opakowania dla
echo
i używanie jej WSZĘDZIE, gdzie wypisujesz wartości dostarczone przez użytkownika:źródło
Możesz również ustawić niektóre nagłówki odpowiedzi HTTP związane z XSS za pośrednictwem
header(...)
dla pewności włączony jest tryb ochrony XSS przeglądarki.
aby włączyć zabezpieczenia treści po stronie przeglądarki. Zobacz ten, aby uzyskać szczegółowe informacje na temat zasad bezpieczeństwa treści (CSP): http://content-security-policy.com/ Zwłaszcza skonfigurowanie CSP do blokowania skryptów wbudowanych i zewnętrznych źródeł skryptów jest pomocne w przypadku XSS.
ogólną garść przydatnych nagłówków odpowiedzi HTTP dotyczących bezpieczeństwa twojej aplikacji internetowej można znaleźć na stronie OWASP: https://www.owasp.org/index.php/List_of_useful_HTTP_headers
źródło
źródło
preg_replace
tak, jak używaeval
na swój wkład. owasp.org/index.php/PHP_Security_Cheat_Sheet#Code_InjectionUżyj
htmlspecialchars
naPHP
. Na HTML staraj się unikać używania:element.innerHTML = “…”; element.outerHTML = “…”; document.write(…); document.writeln(…);
gdzie
var
jest kontrolowany przez użytkownika .Oczywiście staraj się unikać
eval(var)
, jeśli musisz użyć któregoś z nich, spróbuj JS, unikając ich, HTML uciec i być może będziesz musiał zrobić coś więcej, ale dla podstaw powinno to wystarczyć.źródło
Najlepszym sposobem ochrony danych wejściowych jest
htmlentities
funkcja użytkowania . Przykład:Możesz uzyskać więcej informacji tutaj .
źródło