Pourquoi est-fenêtre (et unsafeWindow) pas la même chose à partir d'un script, à partir d'une <script> tag?
J'ai été confronté à un problème pendant le développement de cette petit script. Quand j'ai voulu bloquer tous les XMLHttpRequest
de l'exécution de site web avec mon script, il ne se passait rien (au moins avec Chrome):
function main() {
//Override XHR.open with a custom function
window.XMLHttpRequest.prototype.open = function() {
//Nothing... so it's supposed to block every xhr.open() call
}
}
main();
Même chose lors du remplacement de window
par unsafeWindow
.
Cependant, lorsque j'ai utilisé ce petit truc, tout a fonctionné comme un charme:
//No more call to main(), and:
var script = document.createElement("script");
script.textContent = "(" + main.toString() + ")();";
document.body.appendChild(script);
Chaque appel à xhr.open
est remplacé par ma fonction personnalisée, plus d'AJAX.
Donc je suppose que la window
élément n'est pas la même main
est appelée à partir de l'intérieur du script que lorsqu'elle est appelée à partir d'un <script></script>
conteneur. Quelqu'un peut-il m'expliquer pourquoi ?
OriginalL'auteur Loïs Di Qual | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Voir "Êtes utilisateur de google Chrome-scripts séparés de l'espace de noms global, comme les scripts Greasemonkey?". Chrome userscripts/contenu-les scripts et les scripts Greasemonkey sont isolées à partir de la page du javascript. Ceci est fait pour vous aider à garder d'être piraté, mais il a également réduit les conflits et des effets secondaires inattendus.
Toutefois, les méthodes sont différentes pour chaque navigateur...
Firefox:
@subvention none
est en vigueur (comme de GM 1.0).unsafeWindow
pour accéder à la page cible du javascript. Mais attention, il est possible hostile webmasters de suivreunsafeWindow
l'utilisation du script du contexte et ainsi d'obtenir des privilèges élevés pour pwn vous avec.Chrome:
Les versions récentes de Chrome maintenant de fournir un objet nommé
unsafeWindow
, pour de très compatibilité limitée, mais cet objet ne fournit aucun accès à la page cible du JS. C'est le même quewindow
dans le script de la portée (ce qui n'est paswindow
dans la page de la portée).Cela dit, la version de votre script utilisé
unsafeWindow
doit travailler sur/dans Firefox, si elles sont appliquées correctement. Il pourrait de travail à l'aide de l'extension Tampermonkey sur Chrome, mais je ne vais pas vérifier à deux fois maintenant.Lorsque vous effectuez cette "astuce" (
var script = document.createElement("script"); ...
), vous êtes injection code dans la page cible. Cela contourne le bac à sable et est la seule façon normale Chrome script pour un script pour interagir avec la page JS.Injection avantages:
Injection inconvénients:
Le script, au moins l'injection de pièces, ne peut pas utiliser les privilèges accrus (surtout en cross-domain) fournis par le
GM_
fonctions, surtoutGM_xmlhttpRequest()
.Notez que actuellement Chrome ne supporte
GM_addStyle
,GM_xmlhttpRequest
,GM_log
etGM_openInTab
, pleinement, de manière native.Tampermonkey prend en charge
GM_
fonctions presque entièrement, cependant.Peut provoquer des effets secondaires ou des conflits avec la page JS.
À l'aide de bibliothèques externes introduit encore plus de conflits et de problèmes de timing. C'est loin d'être aussi facile que
@require
.@require
, dirige également la JS externe à partir d'une copie locale -- l'accélération de l'exécution et de tous, mais en éliminant la dépendance sur un serveur externe.La page pouvez le voir, l'utilisation, la modification, ou de bloquer le script.
Nécessite JS pour être activé. Firefox Greasemonkey, en particulier, peuvent s'exécuter sur une page qui n'a JS bloqué. Cela peut être une aubaine sur des ballonnements, de merde, et/ou intrusive pages.
OriginalL'auteur