Co oznacza odpowiedź wywołania Ajax typu ' for (;;); {JSON data}'? [duplikat]

to pytanie ma już odpowiedzi tutaj : Zamknięte 8 lat temu .

Możliwy duplikat:
dlaczego ludzie umieszczają kod typu "throw 1; " I "for (;);" przed odpowiedziami json?

Znalazłem tego rodzaju składnia jest używana na Facebook dla połączeń Ajax. Jestem zdezorientowany w części for (;;); na początku odpowiedzi. W jakim celu się go stosuje?

To jest wezwanie i odpowiedź:

GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0

Odpowiedź:

for (;;);{"t":"continue"}
Author: Community, 2011-06-14

5 answers

Jestem trochę spóźniony i T. J. w zasadzie rozwiązał zagadkę, ale pomyślałem, że podzielę się świetnym artykułem na ten konkretny temat, który ma dobre przykłady i zapewnia głębszy wgląd w ten mechanizm.

Te nieskończone pętle są środkiem zaradczym przeciwko "porwaniu Javascript", rodzajowi ataku, który zwrócił uwagę opinii publicznej z atakiem na Gmail, który został opublikowany przez Jeremiah Grossman {7]}.

Pomysł jest tak prosty, jak piękny: wielu użytkowników zazwyczaj jest zalogowanych na stałe w Gmail lub Facebook. Więc to, co robisz, to konfigurujesz witrynę i w skrypcie JavaScript złośliwej witryny nadpisujesz konstruktor obiektu lub tablicy:

function Object() {
    //Make an Ajax request to your malicious site exposing the object data
}

Następnie dołączasz <script> tag w tej witrynie, taki jak

<script src="http://www.example.com/object.json"></script>

I na koniec możesz przeczytać wszystko o obiektach JSON w dziennikach twojego złośliwego serwera.

Zgodnie z obietnicą, link do papieru .

 18
Author: emboss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-17 19:57:57

Podejrzewam, że głównym powodem jest kontrola. To zmusza do pobierania danych przez Ajax, a nie przez JSON-P lub podobny (który używa znaczników script, a więc zawiedzie, ponieważ pętla for jest nieskończona), a tym samym zapewnia, że ta sama polityka pochodzenia działa. Pozwala to im kontrolować, jakie dokumenty mogą wywoływać API - w szczególności tylko dokumenty, które mają takie samo pochodzenie jak to wywołanie API lub takie, do których Facebook przyznaje dostęp za pośrednictwem CORS (w przeglądarkach obsługujących CORS). Więc musisz zażądać danych za pomocą mechanizmu, w którym przeglądarka będzie egzekwować SOP, i musisz wiedzieć o tym przedmowie i usunąć go przed deserializacją danych.

Więc tak, chodzi o kontrolowanie (użytecznego) dostępu do tych danych.
 157
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-14 06:50:06

Facebook ma mnóstwo programistów pracujących wewnętrznie nad wieloma projektami i bardzo często zdarza się, że ktoś popełnia drobny błąd; czy jest to coś tak prostego i poważnego, jak brak ucieczki danych wstawionych do szablonu HTML lub SQL, czy coś tak skomplikowanego i subtelnego, jak użycie eval (czasami nieefektywnego i prawdopodobnie niepewnego) lub JSON.parse (zgodne, ale nie powszechnie zaimplementowane rozszerzenie) zamiast "znanego dobrego" dekodera JSON, ważne jest, aby dowiedzieć się, jak łatwo egzekwowanie najlepszych praktyk w tej populacji deweloperów.

Aby stawić czoła temu wyzwaniu, Facebook ostatnio "na całego" z wewnętrznymi projektami zaprojektowanymi, aby z wdziękiem egzekwować te najlepsze praktyki, i szczerze mówiąc, jedynym wyjaśnieniem, które naprawdę ma sens w tym konkretnym przypadku, jest to, że: ktoś wewnętrznie zdecydował, że wszystkie parsowanie JSON powinno przejść przez pojedynczą implementację w ich podstawowej bibliotece, a najlepszym sposobem na egzekwowanie tego jest każda pojedyncza odpowiedź API, aby uzyskać for(;;); automatycznie przyklejany z przodu.

Robiąc to, programista nie może być "leniwy": zauważy natychmiast jeśli użyje eval(), zastanowi się, co się dzieje, a następnie uświadomi sobie swój błąd i skorzysta z zatwierdzonego API JSON.

Pozostałe odpowiedzi wydają się należeć do jednej z dwóch kategorii:

  1. nieporozumienie JSONP, lub
  2. nieporozumienie "porwanie JSONA".

Ci z pierwszej kategorii polegają na pomyśle, że napastnik może w jakiś sposób złożyć żądanie "używając JSONP" do API, które go nie obsługuje. JSONP jest protokołem, który musi być obsługiwany zarówno na serwerze, jak i na kliencie: wymaga od serwera zwrócenia czegoś podobnego do myFunction({"t":"continue"}), tak aby wynik został przekazany do funkcji lokalnej. Nie można po prostu "używać JSONP" przez przypadek.

Ci z drugiej kategorii powołują się na bardzo realną lukę, która została opisana, pozwalając na fałszowanie żądań między witrynami za pomocą tagów do interfejsów API, które nie używają JSONP (takich jak ten), pozwalając na formę "JSON hijacking". Odbywa się to poprzez zmianę konstruktora tablicy / obiektu, który umożliwia dostęp do informacji zwracanych z serwera bez funkcji owijania.

Jest to jednak po prostu niemożliwe w tym przypadku: powodem, dla którego to działa, jest to, że czysta tablica (jeden z możliwych wyników wielu interfejsów API JSON, takich jak słynny przykład Gmaila) jest poprawnym wyrażeniem, co nie jest prawdą w przypadku gołego obiektu.

W rzeczywistości, składnia obiektów zdefiniowanych przez JSON (która zawiera cudzysłowy wokół nazw pól, Jak pokazano w tym przykładzie) jest sprzeczna ze składnią bloków i dlatego nie może być używana na najwyższym poziomie skryptu.

js> {"t":"continue"}
typein:2: SyntaxError: invalid label:
typein:2: {"t":"continue"}
typein:2: ....^

Aby ten przykład był możliwy do wykorzystania poprzez remapowanie konstruktora Object (), wymagałoby to, aby API zamiast tego zwróciło obiekt wewnątrz zestawu nawiasów, czyniąc go poprawnym JavaScript (ale nie poprawnym JSON).

js> ({"t":"continue"})
[object Object]

Teraz, to Może być tak, że ta sztuczka z prefiksem for(;;); pojawia się tylko "przypadkowo" w tym przykładzie i jest w rzeczywistości zwracana przez inne wewnętrzne interfejsy API Facebook, które zwracają tablice; ale w tym przypadku należy to naprawdę zauważyć, ponieważ to byłaby "prawdziwa" przyczyna, dla której for(;;); pojawia się w tym konkretnym fragmencie.

 107
Author: Jay Freeman -saurik-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-19 22:06:44

Cóż, for(;;); jest nieskończoną pętlą (możesz użyć konsoli JavaScript Chrome, aby uruchomić ten kod w karcie, jeśli chcesz, a następnie oglądać użycie procesora w Menedżerze Zadań przejść przez dach, aż przeglądarka zabije kartę).

Więc podejrzewam, że może to być umieszczone tam, aby sfrustrować każdego, kto próbuje parsować odpowiedź za pomocą eval lub jakiejkolwiek innej techniki wykonującej zwrócone dane.

Aby wyjaśnić dalej, było dość powszechne, aby analizować trochę JSON-sformatowane dane za pomocą funkcji eval() JavaScript, wykonując coś w stylu:

var parsedJson = eval('(' + jsonString + ')');

...jest to jednak uważane za niebezpieczne, ponieważ z jakiegoś powodu Twoje dane sformatowane w JSON zawierają wykonywalny kod JavaScript zamiast (lub dodatkowo do) sformatowanych w JSON danych, kod ten będzie wykonywany przez eval(). Oznacza to, że jeśli rozmawiasz z niezaufanym serwerem lub jeśli ktoś kompromituje zaufany serwer, może uruchomić dowolny kod na twojej stronie.

Z tego powodu używanie rzeczy takich jak eval() do parsowania danych sformatowanych w formacie JSON jest generalnie źle widziane, a deklaracja for(;;); W JSON Facebook uniemożliwi ludziom przetwarzanie danych w ten sposób. Każdy, kto spróbuje, otrzyma nieskończoną pętlę. Zasadniczo Facebook Facebook stara się wymuszać, aby ludzie pracowali z jego API w sposób, który nie pozostawia ich podatnych na przyszłe exploity, które próbują przejąć interfejs API Facebooka, aby użyć go jako wektora.

 45
Author: aroth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-14 06:45:12

To wygląda jak hack, aby zapobiec atakowiCSRF . Istnieją specyficzne dla przeglądarki sposoby łączenia się z tworzeniem obiektów, więc złośliwa witryna może najpierw to zrobić, a następnie wykonać następujące czynności:

<script src="http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0" />

Gdyby nie było nieskończonej pętli przed JSONEM, powstałby obiekt, ponieważ JSON może być eval()ed jako javascript, a Hooki wykrywałyby go i wąchały elementy obiektu.

Teraz, jeśli odwiedzasz tę stronę z przeglądarki, po zalogowaniu się na Facebook, to może dostać się na swoje dane tak, jakby to było ty, a następnie wysłać je z powrotem do własnego serwera za pośrednictwem np. AJAX lub javascript post.

 13
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 22:20:21