Double Possible:
Pourquoi les gens mettent un code comme “jeter 1; <ne pas être mal>” et “for(;;);” en face de réponses json?J'ai trouvé ce genre de syntaxe utilisé sur Facebook pour les appels Ajax. Je suis confus sur l'
for (;;);
de la partie au début de réponse. À quoi sert-il?C'est l'appel et la réponse:
GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0
Réponse:
for (;;);{"t":"continue"}
Réponses
Trop de publicités?Je soupçonne que la raison principale c'est il y a le contrôle. C' forces vous pour récupérer les données via Ajax, non pas via JSON-P ou similaires (qui utilise script
balises, et donc serait un échec, parce qu' for
boucle est infinie), et assure ainsi que la Même Politique de l'Origine des coups de pied dans. Cela leur permet de contrôler ce que les documents peuvent émettre des appels à l'API — plus précisément, seuls les documents qui ont la même origine que les appels de l'API, ou de celles qui, Facebook spécifiquement accorde l'accès à la via de la SCRO (pour les navigateurs qui supportent la SCRO). De sorte que vous devez demander les données via un mécanisme où le navigateur de faire respecter le pos, et vous devez savoir à ce sujet que la préface et le retirer avant la désérialisation de données.
Donc oui, c'est sur le contrôle de l' (utile) l'accès à ces données.
Facebook a une tonne de développeurs qui travaillent en interne, sur beaucoup de projets, et il est très commun pour quelqu'un de faire une petite erreur; que ce soit quelque chose d'aussi simple et sérieux comme le défaut de s'échapper de données inséré dans une page HTML ou modèle SQL ou quelque chose d'aussi complexe et subtile que l'utilisation d' eval
(parfois inefficace et sans doute précaire) ou JSON.parse
(conforme aux normes mais ils ne sont pas universellement mis en œuvre pour l'extension) au lieu d'un "bien connues" JSON décodeur, il est important de trouver des moyens de faciliter la mise en œuvre les meilleures pratiques sur la population des développeurs.
Pour faire face à ce défi, Facebook a récemment été de "tous dehors" avec des projets internes conçu pour normalement faire respecter ces bonnes pratiques, et pour être honnête la seule explication qui fait vraiment de sens pour ce cas spécifique est juste que: une personne en interne a décidé que tous les parsing JSON doit passer par un unique de mise en œuvre dans le cœur de leur bibliothèque, et le meilleur moyen d'appliquer de chaque unique de l'API de réponse pour obtenir de l' for(;;);
automatiquement viré sur le devant.
En agissant de la sorte, un développeur ne peut pas être "paresseux": ils remarqueront immédiatement s'ils utilisent eval()
, me demande ce qui est en haut, et puis se rendent compte de leur erreur et de l'utilisation approuvées API JSON.
Les autres réponses fournies semblent tous se divisent en deux catégories:
- l'incompréhension JSONP, ou
- malentendu "JSON détournement".
Ceux de la première catégorie (qui, malheureusement, comprend la accepté de répondre) s'appuient sur l'idée qu'un pirate peut en quelque sorte faire une demande "à l'aide de JSONP" à une API qui ne le supporte pas. JSONP est un protocole qui doit être pris en charge sur le serveur et le client: elle nécessite que le serveur de retour de quelque chose qui s'apparente à l' myFunction({"t":"continue"})
tels que le résultat est transmis à une fonction locale. Vous ne pouvez pas simplement "utiliser JSONP" par accident.
Ceux de la deuxième catégorie sont en citant un très réel de la vulnérabilité qui a été décrit en permettant à un cross-site request forgery via les tags Api ne pas utiliser JSONP (comme celui-ci), permettant à une forme de "JSON détournement". Cela se fait en modifiant le Tableau/constructeur de l'Objet, qui permet d'accéder à l'information retournée par le serveur sans un emballage de fonction.
Cependant, ce n'est tout simplement pas possible dans ce cas: la raison, il fonctionne à tous, c'est qu'un simple tableau (un résultat possible de nombreux JSON Api, comme la célèbre Gmail exemple) est une expression valide déclaration, qui n'est pas vrai pour un simple objet.
En fait, la syntaxe pour les objets définis par JSON (qui comprend des guillemets autour des noms de champ, comme on le voit dans cet exemple) en conflit avec la syntaxe pour les blocs, et ne peut donc pas être utilisé au top niveau d'un script.
js> {"t":"continue"}
typein:2: SyntaxError: invalid label:
typein:2: {"t":"continue"}
typein:2: ....^
Pour cet exemple, pour être exploitable par le biais de l'Objet() constructeur de reconfiguration, elle aurait besoin de l'API avoir retourné l'objet à l'intérieur d'un jeu de parenthèses, de le rendre valide JavaScript (mais alors pas JSON valide).
js> ({"t":"continue"})
[object Object]
Maintenant, il pourrait être que ce for(;;);
préfixe truc, c'est seulement "accidentellement" en montrant dans cet exemple, et est, en fait, retourné par d'autres internes Facebook Api qui sont de retour de tableaux; mais dans ce cas, que devraient vraiment être noté, car ce serait alors la "vraie" cause de pourquoi for(;;);
apparaît dans cet extrait.
Bien l' for(;;);
est une boucle infinie (vous pouvez utiliser la console JavaScript de Chrome pour exécuter ce code dans un onglet si vous le souhaitez, puis de regarder le CPU-utilisation dans le gestionnaire des tâches de passer par le toit jusqu'à ce que le navigateur tue l'onglet).
Donc je pense que peut-être il est là pour contrecarrer toute personne qui tente d'analyser la réponse à l'aide de eval
ou de toute autre technique qui exécute les données renvoyées.
Pour expliquer plus loin, il l'habitude d'être assez banales pour analyser un bit de données au format JSON à l'aide de JavaScript eval()
de la fonction, en faisant quelque chose comme:
var parsedJson = eval('(' + jsonString + ')')
;
...ceci est considéré comme dangereux, cependant, que si, pour une certaine raison, vos données au format JSON contient l'exécutable du code JavaScript au lieu de (ou en plus) des données au format JSON alors que le code sera exécuté par l' eval()
. Cela signifie que si vous êtes en train de parler avec un serveur non fiable, ou si quelqu'un compromis un serveur de confiance, ils peuvent exécuter du code arbitraire sur votre page.
De ce fait, en utilisant des choses comme eval()
pour analyser les données au format JSON est généralement mal vu, et l' for(;;);
énoncé dans l'Facebook JSON va empêcher les gens de l'analyse des données de cette façon. Toute personne qui tente obtiendrez une boucle infinie. Donc, essentiellement, c'est comme Facebook est en train d'essayer de la faire respecter le travail de personnes avec son API dans un sens qui ne pas les laisser vulnérables aux futurs exploits qui tentent de pirater le Facebook de l'API à utiliser comme un vecteur.
Je suis un peu en retard et T. J. a fondamentalement résolu le mystère, mais je pensais que je voudrais partager une grande feuille de papier sur ce sujet qui a de bons exemples et fournit une meilleure compréhension de ce mécanisme.
Ces boucles infinies sont une contre-mesure contre les "Javascript détournement", un type d'attaque qui a gagné l'attention du public avec une attaque sur Gmail qui a été publié par Jeremiah Grossman.
L'idée est aussi simple que belle: beaucoup d'utilisateurs ont tendance à être connecté de manière permanente dans Gmail ou Facebook. Donc ce que vous faire est de vous mettre en place un site et dans votre site malveillant Javascript de vous remplacer l'objet ou le constructeur array:
function Object() {
//Make an Ajax request to your malicious site exposing the object data
}
ensuite vous incluez un <script>
balise dans ce site comme
<script src="http://www.example.com/object.json"></script>
Et enfin, vous pouvez lire tout sur les objets JSON dans votre malveillants journaux du serveur.
Comme promis, le lien vers le papier.
Cela ressemble à un hack pour prévenir une attaque CSRF. Il y a un navigateur spécifique des moyens de raccordement dans la création d'objet, de sorte qu'un site web malveillant pourrait utiliser le faire en premier, puis les suivantes:
<script src="http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0" />
Si il n'y avait pas la boucle infinie avant le JSON, un objet est créé (depuis JSON peut être eval()ed comme javascript, et les crochets permettrait de détecter et d'intercepter les membres de l'objet.
Maintenant, si vous visitez ce site à partir d'un navigateur, en étant connecté à facebook, il peut accéder à vos données comme si c'était vous, et puis de l'envoyer vers son propre serveur, par exemple, une requête AJAX ou javascript post.