gpt4 book ai didi

javascript - 无法访问 javascript 注入(inject)函数

转载 作者:行者123 更新时间:2023-11-30 06:48:12 25 4
gpt4 key购买 nike

我将以下代码直接注入(inject)到我的浏览器地址栏中。如果我从 Firebug 的 HTML 选项卡中稍微编辑它(甚至不更改任何代码),它就会起作用。这段代码将更改页面上所有表单的 onsubmit 事件以调用一个函数,该函数检索该表单的字段值并将其作为 GET 方法发送到另一个 URL。是同源政策阻止我这样做,还是我的代码真的错了?

注意:对于可怕的单行编码和低效的解析感到抱歉。

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;
})()

最佳答案

如果我对你的问题理解正确,你真的只需要改变表单的方法和 Action 属性:

(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';
}
})()

在一行中,这将是 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"}})() .

表单提交不受同源策略的影响,因为它们是浏览器的一项非常古老的功能。删除跨域提交表单的功能将灾难性地破坏网站兼容性。

编辑:如果您需要复制表单,请使用 onsubmit 处理程序,您可以使用 cloneNode DOM 方法制作该副本,使用 target="在新的弹出窗口中打开_空白”:

(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;
}
};
}
})()

使用 Closure Compiler 压缩成书签形式,即: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}}})()

它仅适用于 Internet Explorer、Firefox 和 Opera,但希望这足以让您入门。

关于javascript - 无法访问 javascript 注入(inject)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4057202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com