【问题标题】:Safari and Chrome adding form values to URLSafari 和 Chrome 将表单值添加到 URL
【发布时间】:2011-04-02 06:16:22
【问题描述】:

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

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

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;

有什么想法吗?

【问题讨论】:

  • 也许是个愚蠢的问题,但是您提交的表单上有return false 吗?
  • 作为旁注,你为什么要在这里使用这个复杂的 Ajax 东西?对我来说似乎没有意义,因为无论如何您都在重新加载整个页面。
  • 啊,我现在明白了,你正在做一些散列。不过,使用 SSL 和普通的登录表单可能是更安全、更简单的解决方案。
  • SSL 对于相关网站来说太过分了。它最初是用 AJAX 编写的,以避免页面重新加载,即使现在重新加载仅适用于在登录时切换语言的用户(低于 10% 的用户群)。

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


【解决方案1】:

在您描述的情况下,表单实际上已发布,可能是因为用户关闭了 Javascript 或 xmlhttpPost 中出现脚本错误。

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

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

【讨论】:

  • 但是那不会仍然以明文形式发送密码,仅作为 POST 而不是 GET?在这里澄清一下,表单中的值永远不会被列出,它们只是在那里,所以 JavaScript 可以计算哈希等。我可能应该完全撕掉
    标签并将它们作为单独的字段处理.. .
  • @jpatokal 如果您不希望表单在非 Javascript 浏览器中正常降级,删除 form 可能是最好的主意。否则你肯定会遇到这样的问题。
【解决方案2】:

你知道我最讨厌 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

【讨论】:

  • 这不是真正的解决方案。关闭 Javascript 后,它仍会将登录数据发布到 URL。
  • 为什么不处理提交事件,让用户可以点击回车登录?
  • @ZippyV:我已经有一个 JavaScript 按键挂钩,可以在任何浏览器中同时捕获 Enter 和 Tab,但显然 Chrome/Safari 的提交挂钩首先执行。
猜你喜欢
  • 1970-01-01
  • 2011-02-03
  • 2015-09-11
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多