Urządzenie original XHR nigdy nie zostało zaprojektowane w taki sposób, aby zezwalać na żądania różnych źródeł. Powodem była konkretna luka w zabezpieczeniach znana głównie pod numerem CSRF attacks.
W tym scenariuszu ataku witryna osoby trzeciej może zmusić agenta użytkownika ofiary do wysłania sfałszowanych, ale ważnych i zgodnych z prawem żądań do witryny źródłowej. Z punktu widzenia serwera źródłowego takie sfałszowane żądanie nie jest niedostrzegalne na podstawie innych żądań tego użytkownika zainicjowanych przez strony internetowe serwera źródłowego. Powodem tego jest fakt, że jest to agent użytkownika, który wysyła te żądania, a ponadto automatycznie uwzględniałby wszelkie poświadczenia, takie jak pliki cookie, uwierzytelnianie HTTP, a nawet certyfikaty SSL po stronie klienta.
Teraz takie wnioski można łatwo sfałszować: Rozpoczynając od prostych żądań GET, za pomocą <img src="…">
, aż do żądań POST, za pomocą formularzy i przesyłając je automatycznie.Działa to tak długo, jak długo można przewidzieć, jak fałszować takie ważne żądania.
Ale to nie jest główny powód, dla którego nie wolno zgłaszać żądań krzyżowych dotyczących XHR. Ponieważ, jak pokazano powyżej, istnieją sposoby na fałszowanie żądań nawet bez XHR, a nawet bez JavaScript. Nie, głównym powodem, dla którego XHR nie dopuszcza wniosków o krzyżowe pochodzenie, jest to, że jest to JavaScript na stronie strony trzeciej, do której zostanie wysłana odpowiedź. Tak więc nie byłoby możliwe wysyłanie żądań o różnych nazwach pochodzenia, ale także otrzymywanie odpowiedzi, która może zawierać poufne informacje, które byłyby wtedy dostępne przez JavaScript.
Dlatego oryginalna specyfikacja XHR nie zezwalała na żądania różnych źródeł. Jednak wraz z rozwojem technologii pojawiły się uzasadnione wnioski o poparcie wniosków o krzyżowe pochodzenie. Dlatego oryginalna specyfikacja XHR została rozszerzona na XHR level 2 (XHR i XHR poziom 2 są teraz połączone), gdzie głównym rozszerzeniem jest obsługa żądań krzyżowych w ramach określonych wymagań, które są określone jako CORS. Teraz serwer ma możliwość sprawdzenia pochodzenia żądania, a także może ograniczyć zbiór dozwolonych początków, a także zestaw dozwolonych metod HTTP i pól nagłówka.
Teraz do JSONP: Aby uzyskać odpowiedź JSON z żądania w JavaScript i móc ją przetworzyć, musi to być żądanie tego samego pochodzenia lub, w przypadku żądania połączenia krzyżowego, serwer i agent użytkownika musiałby obsługiwać CORS (z których ten ostatni jest obsługiwany tylko przez nowoczesne przeglądarki). Ale aby móc pracować z dowolną przeglądarką, wymyślono JSONP, który jest po prostu ważnym połączeniem funkcji JavaScript z JSON jako parametrem, który można załadować jako zewnętrzny JavaScript przez <script>
, który podobnie jak <img>
, nie jest ograniczony do tego samego pochodzenia upraszanie. Ale tak samo jak każde inne żądanie, żądanie JSONP jest również podatne na CSRF.
więc zawrzeć ją z punktu widzenia bezpieczeństwa:
- XHR wymagane jest, aby wnioski o zasobach JSON, aby uzyskać ich reakcje w JavaScript
- XHR2/CORS jest zobowiązany do żądania krzyż pochodzenia dla zasobów JSON, aby uzyskać ich reakcje w JavaScript
- JSONP jest obejście w celu obejścia żądania krzyż pochodzenia z XHR
ale również:
- Kucie żądania jest śmiesznie łatwe, chociaż kucie ważnych i uzasadnionych żądań jest trudniejsze (ale często bardzo proste, jak również)
- ataki CSRF są nie należy lekceważyć zagrożenia, więc nauczyć się protect against CSRF
To należy do http://security.stackexchange.com/ – Knu