2010-10-30 6 views
2

J'injecte le code suivant directement dans la barre d'adresse de mon navigateur. Si je l'édite juste un peu (même si je ne change même pas de code) de l'onglet HTML dans Firebug, cela fonctionnera. Ce morceau de code modifie l'événement onsubmit de tous les formulaires sur une page pour appeler une fonction qui récupère les valeurs de champ de ce formulaire et l'envoie en tant que méthode GET à une autre URL. Est-ce la même politique d'origine qui m'empêche de faire cela, ou est-ce que mon code est vraiment?Impossible d'accéder à la fonction javascript injectée

Remarque: Désolé pour le mauvais codage sur une ligne et l'analyse inefficace.

javascript:(function() { 
    document.getElementsByTagName('head').item(0).innerHTML += '<script>function scGD(i){i--;var value="form="+i;for(var j=0;j<document.forms[i].elements.length;j++){if(document.forms[i].elements[j].name!=""&&document.forms[i].elements[j].name!=null){value+="&"+document.forms[i].elements[j].name+"="+document.forms[i].elements[j].value;}}alert("Value is: "+value);window.open("./postvalidation.php?"+value);}</script>'; 
    var split2 = []; 
    var split3 = []; 
    var split1 = document.getElementsByTagName('body')[0].innerHTML.split("<form"); 
    for (var i = 1; i < split1.length; i++) { 
     split2[i - 1] = split1[i].split(">"); 
     split3[i - 1] = split2[i - 1][0].split("onSubmit=\"", 2); 
     if (split3[i - 1].length == 1) { 
      split3[i - 1] = split2[i - 1][0].split("onsubmit=\""); 
     } 
     if (split3[i - 1].length == 1) { 
      split3[i - 1] = split2[i - 1][0].split("ONSUBMIT=\""); 
     } 
     if (split3[i - 1].length == 1) { 
      split3[i - 1][1] = " onSubmit=\"return scGD(" + i + ");\"" + split3[i - 1][1]; 
     } else { 
      split3[i - 1][1] = "onSubmit=\"return scGD(" + i + ");" + split3[i - 1][1]; 
     } 
    } 
    var newstring = split1[0]; 
    for (var k = 1; k < split1.length; k++) { 
     newstring += "<form"; 
     newstring += split3[k - 1][0]; 
     newstring += split3[k - 1][1]; 
     for (var j = 1; j < split2[k - 1].length; j++) { 
      newstring += ">"; 
      newstring += split2[k - 1][j]; 
     } 
    } 
    document.getElementsByTagName('body')[0].innerHTML = newstring; 
})() 
+0

Je comprends que les bookmarklets doivent être sur une seule ligne, mais pouvez-vous formater ceci pour qu'il soit plus lisible? – Yahel

Répondre

0

Si je comprends bien votre question, vous avez vraiment besoin de changer les attributs de la méthode et de l'action de la forme:

(function(){ 
    var f = document.forms; 
    for(var x = 0; x < f.length; x++) { 
     f[x].method = 'GET'; 
     f[x].action = 'http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi'; 
    } 
})() 

Dans une ligne, ce serait javascript:(function(){var f=document.forms;for(var x=0;x<f.length;x++){f[x].method="GET";f[x].action="http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi"}})().

Les soumissions de formulaire sont et non affectées par la règle de même origine car elles sont une caractéristique très ancienne des navigateurs. En supprimant la possibilité de soumettre des formulaires interdomaines, la compatibilité du site Web serait catastrophique.

EDIT: Utilisez un gestionnaire onsubmit si vous avez besoin de faire une copie du formulaire, et vous pouvez faire cette copie en utilisant la méthode DOM cloneNode, ouverture dans une nouvelle fenêtre pop-up en utilisant target = « _ blank »:

(function(){ 
    var f = document.forms; 
    for(var x = 0; x < f.length; x++) { 
     f[x].oldOnsubmit = f[x].onsubmit || function() { 
      return true; 
     }; 
     f[x].onsubmit = function() { 
      var clone = this.cloneNode(true); 
      if(this.oldOnsubmit.apply(this, arguments)) { 
       clone.method = 'GET'; 
       clone.action = 'http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi'; 
       clone.target = '_blank'; 
       clone.style.display = 'none'; 
       clone.onsubmit = null; 
       document.body.appendChild(clone); 
       clone.submit(); 
      } else { 
       return false; 
      } 
     }; 
    } 
})() 

compressé en forme de bookmarklet en utilisant la fermeture du compilateur, ce serait: javascript:(function(){for(var c=document.forms,b=0;b<c.length;b++){c[b].oldOnsubmit=c[b].onsubmit||function(){return true};c[b].onsubmit=function(){var a=this.cloneNode(true);if(this.oldOnsubmit.apply(this,arguments)){a.method="GET";a.action="http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi";a.target="_blank";a.style.display="none";a.onsubmit=null;document.body.appendChild(a);a.submit()}else return false}}})()

Il ne fonctionne que dans Internet Explorer, Firefox et Opera, mais nous espérons que est assez bon pour vous aider à démarrer.

+0

Bonjour la communauté, Désolé d'ouvrir une vieille boîte de Pandore mais est-ce que quelqu'un sait comment je ferais cela dans Google Chrome? Est-ce que cela me permettrait même de faire ça? – user491938

Questions connexes