Zapobiega ujawnieniu odpowiedzi poprzez przejęcie JSON.
Teoretycznie treść odpowiedzi HTTP jest chroniona przez tę samą zasadę pochodzenia: strony z jednej domeny nie mogą uzyskać żadnych informacji ze stron w drugiej domenie (chyba że jest to wyraźnie dozwolone).
Osoba atakująca może zażądać stron w innych domenach w Twoim imieniu, np. Przy użyciu tagu <script src=...>
lub <img>
, ale nie może uzyskać żadnych informacji o wyniku (nagłówki, treść).
Tak więc, jeśli odwiedzisz stronę atakującego, nie będzie mógł odczytać twojego e-maila z gmail.com.
Tyle że podczas używania znacznika skryptu do żądania treści JSON, JSON jest wykonywany jako JavaScript w środowisku kontrolowanym przez osobę atakującą. Jeśli atakujący może zastąpić konstruktor macierzy lub obiektów lub inną metodę używaną podczas budowy obiektu, wszystko w JSON przejdzie przez kod atakującego i zostanie ujawnione.
Należy zauważyć, że dzieje się tak w momencie wykonywania JSON jako Javascript, a nie w momencie jego analizy.
Istnieje wiele środków zaradczych:
Upewnienie się, że JSON nigdy się nie uruchamia
Umieszczając while(1);
instrukcję przed danymi JSON, Google upewnia się, że dane JSON nigdy nie są wykonywane jako JavaScript.
Tylko uzasadniona strona może uzyskać całą zawartość, usunąć while(1);
i przeanalizować resztę jako JSON.
Rzeczy na przykład for(;;);
były widziane na Facebooku z takimi samymi wynikami.
Upewnij się, że JSON nie jest prawidłowym Javascript
Podobnie dodanie nieprawidłowych tokenów przed JSON, na przykład &&&START&&&
, gwarantuje, że nigdy nie zostanie ono wykonane.
Zawsze zwracaj JSON z obiektem na zewnątrz
Jest to OWASP
zalecany sposób ochrony przed porwaniem JSON i jest mniej inwazyjny.
Podobnie jak poprzednie środki zaradcze, upewnia się, że JSON nigdy nie jest wykonywany jako JavaScript.
Prawidłowy obiekt JSON, jeśli nie jest przez niego niczym zamknięty, nie jest poprawny w JavaScript:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Jest to jednak poprawne JSON:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Upewnij się, że zawsze zwracasz obiekt na najwyższym poziomie odpowiedzi. Upewnij się, że JSON nie jest poprawnym skryptem JavaScript, a jednocześnie jest poprawnym JSON.
Jak zauważył @hvd w komentarzach, pusty obiekt {}
jest poprawnym skryptem Javascript, a znajomość obiektu jest pusta może być cenną informacją.
Porównanie powyższych metod
Sposób OWASP jest mniej ingerujący, ponieważ nie wymaga zmian w bibliotece klienta i przesyła prawidłowy JSON. Nie jest jednak pewne, czy poprzednie lub przyszłe błędy przeglądarki mogłyby to rozwiązać. Jak zauważył @oriadam, nie jest jasne, czy dane mogą być wyciekane w wyniku błędu analizy poprzez obsługę błędów, czy nie (np. Window.onerror).
Sposób Google wymaga od biblioteki klienta obsługi automatycznej deserializacji i może być uważany za bezpieczniejszy w przypadku błędów przeglądarki.
Obie metody wymagają zmian po stronie serwera, aby uniknąć sytuacji, w której programiści mogliby przypadkowo wysłać wrażliwy JSON.