Załóżmy, że Twoja witryna ma GetUser
metodę internetową:
http://www.example.com/User/GetUser/32
która zwraca odpowiedź JSON:
{ "Name": "John Doe" }
Jeśli ta metoda akceptuje tylko żądania POST, zawartość zostanie zwrócona do przeglądarki tylko wtedy, gdy żądanie AJAX zostanie wysłane http://www.example.com/User/GetUser/32
przy użyciu metody POST. Pamiętaj, że jeśli nie zaimplementowałeś CORS , przeglądarka będzie chronić dane z innych domen wysyłających to żądanie do Ciebie.
Jeśli jednak zezwolisz na żądania GET, a także wykonanie żądania AJAX podobnego do powyższego za pomocą GET zamiast POST, złośliwy użytkownik może dołączyć twój script
kod JSON w kontekście własnej witryny, używając tagu w kodzie HTML. np. na www.evil.com
:
<script src="http://www.example.com/User/GetUser/32"></script>
Ten JavaScript powinien być bezużyteczny, www.evil.com
ponieważ nie powinno być możliwości odczytania obiektu zwróconego przez twoją metodę sieciową. Jednak ze względu na błędy występujące w starszych wersjach przeglądarek (np. Firefox 3) istnieje możliwość przedefiniowania obiektów prototypowych JavaScript i umożliwienia www.evil.com
odczytu danych zwróconych przez Twoją metodę. Jest to znane jako przechwytywanie JSON.
Zobacz ten post, aby zapoznać się z metodami zapobiegania temu. Nie jest to jednak znany problem z późniejszymi wersjami nowoczesnych przeglądarek (Firefox, Chrome, IE).
www.example.com/User/DeleteUser/32
), Ponieważ żądanie będzie zawierać pliki cookie niezbędne do uwierzytelnienia, ponieważ pochodzą one z komputera ofiary.[Authorize]
nie uchroni Cię również przed atakiem opisanym tutaj w przypadku bardzo starej przeglądarki - to sam użytkownik odwiedza,www.evil.com
więc żądanie skierowanewww.evil.com
dowww.example.com
będzie zawierało plik cookie autoryzacyjny.w zwrocie użyj:
źródło
Domyślnie struktura ASP.NET MVC nie pozwala odpowiadać na żądanie GET z ładunkiem JSON, ponieważ istnieje szansa, że złośliwy użytkownik może uzyskać dostęp do ładunku za pośrednictwem procesu znanego jako przejęcie JSON. Nie chcesz zwracać poufnych informacji przy użyciu formatu JSON w żądaniu GET.
Jeśli musisz wysłać JSON w odpowiedzi na GET i nie ujawniasz poufnych danych, możesz jawnie zezwolić na zachowanie, przekazując
JsonRequestBehavior.AllowGet
jako drugi parametr doJson
metody.Jak na przykład
Oto interesujący artykuł Phila Haacka
JSON Hijacking
o tym, dlaczego nie używać Json z metodą GETźródło
Kiedy chcemy zwrócić obiekt json do klienta z aplikacji MVC, powinniśmy jawnie określić JsonRequestBehavior.AllowGet podczas zwracania obiektu. W rezultacie zwracam dane json jak poniżej, aby rozwiązać problem:
źródło
Musisz używać JsonRequestBehavior.AllowGet dla odpowiedzi Json w następujący sposób:
źródło
return Json ("Sukces", JsonRequestBehavior.AllowGet)
źródło