nienawidzę złamać go do ciebie, ale -
- XSS jest problemem wyjścia, nie problem związany wejściowe. Filtrowanie/sprawdzanie poprawności danych jest dodatkową warstwą obrony, ale nigdy nie może całkowicie Cię ochronić przed XSS. Spójrz na XSS cheatsheet by RSnake - jest zbyt wiele sposobów na ucieczkę z filtra.
- Nie ma łatwego sposobu naprawienia starszej aplikacji. Musisz poprawnie zakodować wszystko, co umieścisz w swoich plikach html lub javascript, a to oznacza ponowne przejrzenie każdego fragmentu kodu, który generuje html.
Aby uzyskać więcej informacji na temat zapobiegania XSS, patrz: OWASP's XSS prevention cheat sheet.
Niektóre komentarze poniżej sugerują, że sprawdzanie poprawności danych wejściowych jest lepszą strategią niż kodowaniem/unikaniem w momencie wyprowadzania. Podaję tylko od -
Tradycyjnie sprawdzanie danych wejściowych było preferowanym podejściem do obsługi niezaufanych danych. Jednak sprawdzanie danych wejściowych nie jest doskonałym rozwiązaniem w przypadku ataków typu "injection". Po pierwsze, sprawdzanie danych wejściowych jest zwykle wykonywane po odebraniu danych, zanim znane stanie się miejsce docelowe. Oznacza to, że nie wiemy, które znaki mogą być znaczące w tłumaczeniu docelowym. Po drugie, a może nawet ważniejsze, aplikacje muszą zezwalać na potencjalnie szkodliwe znaki. Na przykład, czy biedny pan O'Malley nie może rejestrować się w bazie danych tylko dlatego, że SQL uważa "specjalną postać?
Aby opracować - kiedy użytkownik wprowadza ciąg znaków takich jak O'Malley, nie wiesz, czy potrzebujesz tego ciągu w javascript, lub w html lub w jakimś innym języku. Jeśli jest on w javascript, musisz go renderować jako O\x27Malley
, a jeśli jest w HTML, powinien wyglądać jak O'Malley
. Dlatego zaleca się, aby w bazie danych zapisano ciąg znaków dokładnie w taki sposób, w jaki użytkownik wprowadził, a następnie uciekł odpowiednio w zależności od ostatecznego miejsca docelowego ciągu.
nocie, że chcesz, aby zapobiec użyciu języka programowania po stronie serwera/ram, nie stosując po stronie klienta (jak JS). Języki po stronie klienta są dezaktywowane, hackowane i można je zindywidualizować przez klienta. – BalusC
proszę obejrzeć: http://www.petefreitag.com/item/759.cfm – Henry