2010-09-03 6 views
6

Jestem nowicjuszem w ColdFusion, więc nie jestem pewien, czy jest to prosty sposób na zrobienie tego. Zostałem przydzielony do naprawienia luk XSS w całej witrynie na tej stronie CF. Niestety, jest mnóstwo stron, które biorą użytkownika danych wejściowych, i byłoby prawie niemożliwe, aby wejść i zmodyfikować je wszystkie.Zapobieganie atakom XSS na terenie całego serwisu

Czy istnieje sposób (w CF lub JS), aby łatwo zapobiec atakom XSS w całej witrynie?

+1

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

+0

proszę obejrzeć: http://www.petefreitag.com/item/759.cfm – Henry

Odpowiedz

35

nienawidzę złamać go do ciebie, ale -

  1. 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.
  2. 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.

+0

O czym ty mówisz? Nie ma znaczenia, czy filtrujesz dane wejściowe czy wyjściowe. Ostatecznie, jeśli filtrowane są dane wejściowe, dane wyjściowe będą w porządku LUB można przechowywać je jako surowe i filtrować je na każde żądanie, które wydaje się marnotrawstwem. – Klinky

+4

@Klinky - Zobacz moją zaktualizowaną odpowiedź. Filtrowanie wejściowe * pomaga *, ale nie jest niezawodnym rozwiązaniem dla XSS. –

+0

Dobre punkty, twoja aktualizacja i dokładne przeczytanie OWASP-u sprawia, że ​​bardziej zrozumiałe jest, dlaczego ucieczka na wyjściu byłaby korzystniejsza i bardziej elastyczna. Nadal twierdzę, że sprawdzanie poprawności jest wymaganiem dla rzeczy, które mogą być skutecznie sprawdzone, na przykład nie chcesz akceptować wprowadzania przez użytkownika ciągu znaków, gdy twój db lub javascript będzie oczekiwał liczby całkowitej. To nie byłby jednak problem z XSS. – Klinky

0

The ColdFusion 9 Livedocs opisują ustawienie o nazwie "scriptProtect", które pozwala na wykorzystanie ochrony coldfusion. Jeszcze go nie używałem, więc nie jestem pewien, czy to jest skuteczne.

Jeśli jednak wdrożysz metodę zewnętrzną lub własną metodę obsługi, najprawdopodobniej zechcesz umieścić ją w zdarzeniu "onRequestStart" aplikacji, aby umożliwić jej obsługę całej witryny, jeśli chodzi o Naruszenie zasięgu URL i zakresu FORMULARZA (ponieważ każde żądanie wykonałoby ten kod).

+3

niezbyt efektywny, niestety. – Henry

1

Jedną z rzeczy, na które należy zwrócić uwagę, jest zastosowanie zapory ogniowej aplikacji, takiej jak Portcullis: http://www.codfusion.com/blog/page.cfm/projects/portcullis, która zawiera znacznie silniejszy system niż wbudowany scriptProtect, który łatwo można pokonać.

To dobry punkt wyjścia do zapobiegania wielu atakom, ale dla XSS masz zamiar skończyć wchodząc ręcznie i sprawdzając, czy używasz rzeczy takich jak HTMLEditFormat() na każdym wyjściu, które może być dotknięte przez klienta lub dane klienta aby zapobiec wyprowadzaniu prawidłowego kodu html/js.

0

Oprócz stosowania wszystkich ColdFusion poprawek i łatek można również:

  1. Nie pełny dowód ale pomaga ustaw następujące pod CFADMIN> Ustawienia> „Włącz Global Protection Script”
  2. Dodaj CSRFToken do listy formy http://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet
  3. Sprawdź http referer
  4. Dodaj walidacji dla wszystkich wejść użytkownika
  5. Używaj cfqueryparam dla zapytań
  6. dodawania HTMLEditFormat() na wszelkich wyjść
  7. Poza doskonałą blogu Petera Freitag powinien również subskrybować Jason Dean http://www.12robots.com