长话短说:仅在Chrome和Safari上,登录表格的值是 有时 即使实际登录通过AJAX发布,也粘贴到用户的URL中。

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>

实际发布的请求甚至不包含挑战参数:

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;

有任何想法吗?

有帮助吗?

解决方案

在您描述的情况下,表格实际上发布了,可能是因为用户已关闭JavaScript或脚本错误在 xmlhttpPost.

表格将作为一个 GET 在某些浏览器中请求,因为您没有指定 method 财产。 (我认为 GET 是根据标准的正确默认值,但有些浏览器偏离了此。因此,表单数据将最终出现在URL中。

给出表格 method="POST": :这将在URL部分中修复密码数据。

其他提示

您知道我最讨厌堆栈溢出吗?事实是,通过使您甚至在尽可能简单和减少的形式中提出最棘手的问题,您通常会自己偶然发现解决方案,通常在提交后约5秒钟。

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

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

还有一顶帽子在这里:

在输入中按ENTER时,我如何防止Webkit浏览器提交表格

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top