1

长话短说:仅在 Chrome 和 Safari 上,登录表单中的值有时会粘贴到用户的 URL 中,即使实际登录是通过 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 请求甚至不包含挑战参数:

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;

有任何想法吗?

4

2 回答 2

4

在您描述的情况下,表单实际上已发布,可能是因为用户关闭了 Javascript 或xmlhttpPost.

GET由于您未指定method属性,因此该表单将在某些浏览器中作为请求发送。(我认为这GET是每个标准的正确默认值,但有些浏览器偏离了这一点)。因此,表单数据将在 URL 中结束。

给表单 a method="POST": 这将修复 URL 部分中的密码数据。

于 2010-08-22T11:28:13.310 回答
1

你知道我最讨厌 Stack Overflow 的什么地方吗?事实上,通过让您以尽可能简单和简化的形式列出最棘手的问题,您经常自己偶然发现解决方案,通常在提交后大约 5 秒。

这一次,事实证明按 ENTER 导致 Safari/Chrome (Webkit) 提交表单并将参数粘贴在 URL 中。治疗很简单:

<form name="login" onSubmit='JavaScript:return false;'>

还有一个提示:

在输入中按下输入时如何防止 WebKit 浏览器提交表单

于 2010-08-22T11:29:41.187 回答