Safari和Chrome将表单值添加到URL

时间:2010-08-22 11:23:04

标签: javascript ajax google-chrome safari url-parameters

长话短说:仅限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;

有什么想法吗?

2 个答案:

答案 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