长话短说:仅限Chrome和Safari,登录表单中的值有时会粘贴到用户的网址中,即使实际登录是通过AJAX发布的。
http://my-site.example/?name=user&pw=xxx&challenge=b1be8ad7aac242...
它已被反复报道,我已经看到它发生在我自己身上,但我自己无法重现它,更不用说弄清楚究竟发生了什么。以下是登录表格归结为:
<form name="login">
<input type="Text" name="name">
<input type="password" name="pw">
<input type="hidden" name="challenge">
<input type="button" onclick='JavaScript:xmlhttpPost("/php/login.php")'>
</form>
实际的POSTed请求甚至不包含challenge参数:
function xmlhttpPost(strURL) {
if (window.XMLHttpRequest) {
self.xmlHttpReq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
}
self.xmlHttpReq.open('POST', strURL, true);
...
query = 'name=' + encodeURIComponent(name) + '&pw=' + encodeURIComponent(hash) + '&lpw=' + encodeURIComponent(legacy_hash);
self.xmlHttpReq.send(query);
}
成功登录后,当且仅当用户具有与默认语言不同的语言设置时,才会将用户重定向回同一页面(=强制重新加载):
location.href = "http://" + location.host + location.pathname;
有什么想法吗?
答案 0 :(得分:4)
在您描述的情况下,表单实际上已发布,可能是因为用户关闭了Javascript或xmlhttpPost
发生了脚本错误。
表单将在某些浏览器中作为GET
请求发送,因为您未指定method
属性。 (我认为GET
是标准的正确默认值,但有些浏览器偏离此标准。因此,表单数据将以URL结尾。
将表单设为method="POST"
:这将修复网址部分中的密码数据。
答案 1 :(得分:1)
你知道我最讨厌Stack Overflow吗?事实上,通过让你尽可能简单地简化你最棘手的问题,你经常会在提交后大约5秒内自己绊倒解决方案。
这一次,结果是按下ENTER导致Safari / Chrome(Webkit)提交表单并将参数粘贴到URL中。治愈很简单:
<form name="login" onSubmit='JavaScript:return false;'>
这里有一个小窍门:
How can I prevent WebKit browser to submit a form when enter is pressed in an input