【问题标题】:Google Chrome / macOS: Password field won't accept non-ASCII charactersGoogle Chrome / macOS:密码字段不接受非 ASCII 字符
【发布时间】:2018-05-01 09:21:00
【问题描述】:

更新

显然,这是 OS X 版本的 Google Chrome 的未解决问题。 It was first reported over seven years ago. 如果您碰巧发现自己需要输入包含非 ASCII 字符的密码,那么您可以选择:

  • 在其他地方输入密码,然后通过剪贴板将其传输到密码字段。
  • 使用开发者工具将输入类型从password更改为text。
  • 使用其他浏览器

对于可以输入密码字段的字符是否有任何规则?我一直在 Mac 上尝试使用 Chrome,看起来我只能输入“特殊”字符,如果它们可以通过单个按键生成(不包括修饰键,如 Alt 和 Shift )。

例如,我可以通过单次按键 (AltG) 输入版权符号 (©),但字母“o”带有变音符号 (ö)需要两个(AltU 后跟 O)。在后一种情况下,变音符号不会出现在密码中。在 Windows 中,这些字符似乎是通过在按 Alt 键的同时输入幻数来获得的,因此这种行为可能存在跨平台差异。也可能存在跨浏览器差异。

我问的原因是因为我想实现一个带有密码输入字段的注册表单,该字段可以从type="password" 切换到type="text"。这允许用户检查该字段的内容(假设这样做是安全的),并允许我使用随机密码生成器在该字段中预先填写一些用户可以复制到确认字段中的内容。但是通过这样做,我正在更改该字段接受的字符集。这显然是不可取的;例如,如果我选择Röntgen作为密码,我将永远无法登录(除非登录形式也可切换)。

那么这里最好的方法是什么?我不想完全禁止特殊字符,但将每个人限制为可打印的 ASCII 似乎是最简单的选择。

为了说明问题,这里有一个包含两个密码字段的表单。一个字段可以切换为普通文本输入。单击按钮显示两个字段的内容。

function reveal() {
  if ($('#p1').attr('type') == 'password') {
    $('#p1').attr('type', 'text');
    $('#r').html('(Hide)');
  }
  else {
    $('#p1').attr('type', 'password');
    $('#r').html('(Reveal)');
  }
}

function show_passwords() {
  $('#out1').html($('#p1').val());
  $('#out2').html($('#p2').val());
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <form onsubmit="return false;">
    <p><label>Password:<br><input type="password" id="p1" name="p1" size="20"></label>
    <small><a id="r" href="#" onclick="reveal()">(Reveal)</a></small></p>
    <p><label>Confirm password:<br><input type="password" id="p2" name="p2" size="20"></label></p>
    <p><button onclick="show_passwords(); return false">Show password field contents</button></p>
  </form>
</div>
<table style="min-width:20em; border: 1px solid #bbb">
  <tr><td style="width:8em">Password:</td><td id="out1"></td></tr>
  <tr><td>Password confirm:</td><td id="out2"></td></tr>
</table>

【问题讨论】:

  • 我相信这与客户接受的字符范围有关(即如果他们的客户只处理 UTF-8,他们就只能输入 UTF 8)
  • 我不完全理解这个问题,因为我无法在我这边重现任何类似的东西(Win10 上的 Firefox,带有西班牙语键盘布局),但它感觉像是苹果/谷歌方面的错误或限制,而不是什么在 HTML、JavaScript 或 DOM 中是有意的。当您说“不会出现在密码中”时,您会得到什么?什么都没有?您的应用程序是否使用完全兼容 Unicode 的编码,例如 UTF-8?
  • @ÁlvaroGonzález 就像我说的,我只是得到没有变音符号的“o”。我不明白你所说的 Unicode 兼容性是什么意思。我提供的 sn-p 是从 Stack Overflow 服务器运行的。 Stack Overflow 到处都使用 UTF-8。我也是。我确信 Chrome 与 UTF-8 兼容。我想所有当前的网络浏览器都是。这些都不能解释文本输入和密码输入字段之间的行为差​​异。也许这只是 OS X 的问题?
  • 对不起,有时问题包括堆栈 sn-ps 不能重现问题,因此我的评论。
  • Chrome 在我的 Windows 10(西班牙版布局)副本中似乎也没有表现出这种行为。

标签: html macos google-chrome passwords usability


【解决方案1】:

铬漏洞报告的原始作者在这里。有人告诉我在webkit's bugtraq 上打开相同的问题(当时 Chrome 在 webkit 上运行)并且 webkit 开发人员告诉我 Cocoa(OSX UI 框架)不允许密码字段中的非 ASCII 字符(我已经发现这个问题,我的 OSX 密码不像我的在线服务密码那样具有挑战性)并且 Webkit 努力模仿本机行为。所以问题不在于您的浏览器,而在于 OSX 本身。

公平地说,当 Chrome 切换到 Blink 时,bugtrack 上有一条新消息:

这仍然是一个问题。 在最初的 WebKit 错误中,“决定”在密码控件中允许死键输入并不是一个理想的选择 解决方案,WebKit 应该努力遵循 Cocoa 的行为。

就目前而言,Blink 在两种情况下都失败了:死键的行为与它们在文本字段中的行为不同,但它们确实如此 也不遵循 NSSecureTextField 的行为(即,尽管密钥不是死密钥)。

Safari 9.0.1 中的 WebKit 601.2.7 的行为符合预期。 Blink 是否也应该遵循平台行为,或者会 优先支持密码字段中的死键?

但是时间已经过去了,到目前为止一切都没有改变......

我只使用 Firefox,它不遵循 Cocoa 的限制,并且允许在密码字段中使用任何字符。

如果您不想强迫您的用户,只需从您生成的密码中跳过非 ASCII 字符。

【讨论】:

  • 嗨,谢谢。只是为了记录,我不是生成非ASCII密码,只是一旦密码输入字段已更改为文本,用户就可以将其更改为任何内容。阅读您的答案后,我再次尝试使用 Safari,发现其行为取决于键盘设置。选择日文罗马字键盘时,它工作得很好,但使用美式键盘时,Alt-U 被阻止并发出警报声。在这两种情况下,我仍然可以输入非 ASCII 字符,例如 µ 和 ©(Alt-M 和 Alt-G),所以如果 Apple 有 UI 标准,他们并没有真正正确地遵守它。
  • 好吧,那么我猜你只需要期望你的用户知道这个限制,毕竟他们使用的是 OSX 机器并且应该知道它的技巧:-)
  • 哈。我多年来一直在使用 Mac,这是我第一次遇到这种特殊的怪癖。无论如何,我将按照乔伊对this question 的回答,当用户在密码字段中输入非 ASCII 字符时发出警告消息。
猜你喜欢
  • 2015-08-30
  • 2011-06-20
  • 2015-06-08
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多