49 votes

window.name comme transport de données: une approche valable?

Vue d'ensemble et la question d'origine

de la fenêtre.le nom est un intéressant bête. MDN, description des indications à l'intention originale:

Le nom de la fenêtre est utilisé principalement pour l'établissement de cibles pour les liens hypertexte et les formes. Windows n'avez pas besoin d'avoir des noms.

Donc, cela signifie que nous pouvons ouvrir la console dans cette fenêtre, et d'écrire:

var win = window.open('http://google.com', 'el goog');

...et laissez-le ensuite à travers le bloqueur de pop-up, qui doit ouvrir google.com dans une fenêtre nommée "el goog." Je ne peux pas accéder à l' name de la propriété de l' win en raison de la même origine, mais si j'ouvre une console dans la nouvelle fenêtre et tapez name, je serai "el goog".

Si j'envoie la fenêtre sur le domaine je l'ai ouvert à partir de (dans ce cas stackoverflow.com), je peux obtenir l' name de la propriété, et il n'a pas changé.

win.location.replace(location.href);
win.name; // "el goog"

Cela signifie que nous pouvons avoir une sorte de cross-domaine de la session de banque par le réglage de l' name de la propriété d'une fenêtre.

Si google.com a changé la valeur de window.name avant que la fenêtre a été renvoyé au domaine d'origine, nous verrions la nouvelle valeur à la place de "el goog." Il pourrait être utilisé comme une croix-des données dans le domaine des transports, similaire dans l'utilitaire de JSONP ou de la SCRO.

J'ai fait un peu de recherche pour trouver plus d'info, et apparemment dojo pense qu'il est légitime de transport. D'une certaine manière, cependant, qui n'est pas complètement me rassurer. Donc ma question est, sont l'un des sites dignes de confiance à l'aide de window.name comme le transport de données? Je pense qu'il serait facilement repérable, car leurs docs dirait quelque chose comme "ajouter "de rappel" pour la chaîne de requête pour JSONP, ou ajouter un 'tout' pour la fenêtre.nom de," mais je n'ai jamais rien vu de pareil. Quelqu'un a effectivement repéré ce dans la nature?


Suppléant question

Il peut être le cas que personne n'est vraiment à l'aide de cette technique, si c'est vrai alors (comme Rob W a souligné la question ci-dessus est sans réplique. Donc, mon suppléant question est, quels sont les problèmes avec cette approche? Cela peut aider à expliquer pourquoi il n'a pas vraiment été adopté.

Comme je le vois, il y a au moins deux avantages à cette approche plus JSONP.

  • Avec JSONP, vous faites confiance à un script à partir d'une origine étrangère à s'exécuter sur votre domaine. Avec window.name, tous les scripts inclus par un site malveillant serait de fonctionner sur leur propre domaine.

  • Avec JSONP, il n'y a pas de moyen de passer dans le big data (quelque chose de trop gros pour une URL), et aucun moyen de faire un HTTP POST. Avec window.name,, nous pouvons publier des données arbitraires de toute taille.

Quels sont les inconvénients?


Exemple de mise en œuvre

Voici un exemple très simple de mise en œuvre du client. Cela ne veut pas gérer les requêtes POST, seulement OBTENIR.

function fetchData(url, callback) {
    var frame = document.createElement('iframe');
    frame.onload = function() {
        frame.onload = function() {
            callback(frame.contentWindow.name);
            frame.parentNode.removeChild(frame);
        }
        frame.src = 'about:blank';
    }
    frame.src = url;
    document.body.appendChild(frame);
}

// using it

fetchData('http://somehost.com/api?foo=bar', function(response) {

    console.log(response);

});​

J'ai mis en place un violon pour le tester ici. Il utilise ce script en tant que serveur de test.

Voici un peu plus de exemple qui peut faire des requêtes POST: http://jsfiddle.net/n9Wnx/2/


Résumé

Aussi loin que je peux dire, window.name n'a pas pris sur les données de transport. Je me demande si ma perception est exacte (et donc la question d'origine) et si oui, je me demande pourquoi c'est le cas. J'ai énuméré quelques-uns des avantages qu' window.name semble avoir plus de JSONP. Quelqu'un peut-il identifier certains inconvénients qui pourraient avoir contribué à empêcher l'adoption de cette technique?

Plus au point, quelqu'un peut-il me donner une solide raison pour laquelle je ne devrais pas utiliser winow.name comme le transport de données?

6voto

duskwuff Points 69245

window.name n'est pas particulièrement bon en tant que transport, car (AFAIK) il ne déclenche aucun événement lorsqu'il est modifié. Par conséquent, une application qui essayait d'utiliser window.name comme canal de communication bidirectionnel devrait l'interroger pour les mises à jour.

En ce qui concerne les sites qui l'utilisent réellement: je n'en ai jamais entendu parler. Il y en a peut-être, mais je n'ai entendu parler de cette technique que dans un sens purement théorique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X