如何在不需要用户交互的情况下自动填充密码字段



如果我从我的 Tampermonkey 脚本中检查<input type="password"/>并使用change处理程序观察由 Chrome 的密码管理器功能填充的密码字段的更改,该值将保持为空,直到我在页面中实际执行实际点击。我已经尝试在我的脚本中点击页面,但 Chrome 知道这不是真正的点击。当我在页面中物理单击时,change事件突然触发,密码字段获取一个值,然后我的脚本反应正确(由于具有change事件)。但是我编写此脚本是为了避免首先与页面交互,因此这违背了我的脚本的重点。

有没有办法让TamperMonkey将页面标记为用户与之交互(例如,一些假设的GM_setUserTouched()GM_autoFillPasswords()API),以便密码管理器功能实际上填充了<input type="password"/>,而无需我单击页面?

背景

在Chrome 中,此行为记录在 #352527 注释 15 中,其中报告者是意外行为,#398805 中记录了 Chrome 无法实现我不想要的行为的情况。当自动填充和Chrome的内置密码管理器填写表单时,密码字符会在密码字段中向用户显示,但DOMHTMLInputElement.value设置为"",这被认为是一项功能。当用户与网页互动(例如点击网页或按键)时,Chrome 会修改HTMLInputElement.value以包含密码,并向该元素触发change事件。这样做的引用原因是"安全原因"(例如,如果网站脚本从密码元素读取,则只有在用户查看页面时才有机会这样做......所以弹出框或不可见的框架将无法做到这一点或其他什么?我不确定这能保护你免受什么伤害:一旦用户与页面交互,所有脚本都可以访问密码。如果从与<input type="password"/>相同的来源提供错误的脚本,则网站本身存在安全漏洞,而不是Chrome...

Greasemonkey 历来具有辅助程序 API 和@grant系统,使用户脚本能够解决此类问题。编辑:在创建重现(下图)时,我发现Firefox使DOM可以使用自动填充密码,而无需等待用户与窗互。因此,Greasemonkey不需要GM_forceAutofill()的API,因为Firefox没有表现出这种Chrome怪癖。因此,Tampermonkey没有这样的API。

重现

因为当我描述Chrome表现出的行为时人们不相信我,所以我准备了一个重现。要让 Chrome 进入它认为用户尚未与页面交互的状态需要一些工作,但您应该能够使用以下步骤看到我所看到的内容:

  1. 打开浏览器。我在 Windows 61.0.3163.91 上使用 Chrome 64 位 10。
  2. 导航到 https://fiddle.jshell.net/xqfynp3e/22/show/light/
  3. 输入一些虚假的用户名和密码,然后按回车键或单击按钮。Chrome 应该会提示您保存密码。
  4. 保存密码。
  5. 打开"开发人员工具"。
  6. 在控制台中输入以下内容(导航到页面而不会意外与之交互):window.location.href = 'https://fiddle.jshell.net/xqfynp3e/22/show/light/?1'
  7. 在控制台中运行document.querySelector('input[type=password]').value
  8. 请注意,表单的密码似乎是以可视方式填写的,但在控制台中读取 DOM 元素会产生""
  9. 在文档中单击。
  10. 再次在控制台中运行document.querySelector('input[type=password]').value
  11. 请注意,表单的密码没有改变外观,但在控制台中读取 DOM 元素会生成您保存的虚假密码。

我的问题,重申:如何让 Tampermonkey 执行"点击文档中"步骤?如何告诉 Chrome 的密码自动填充功能,我与网页进行了交互,而实际上并未与网页进行物理交互?

编辑:我找到了另一种方法,可以使用凭据Web API的静默中介支持在Chrome中安全地存储密码并通过用户脚本访问它们:https://i.stack.imgur.com/udkWc.jpg

您无法使用Google的内置密码存储来执行此操作,因为正如您自己所说,Chrome需要用户交互才能启用此类密码- 作为安全功能。

具体来说,Chrome 需要一个将isTrusted属性设置为true的事件。 篡改猴无法解决此问题,因为即使是 Chrome 扩展程序也无法设置isTrusted属性

另请参阅2015年的相关功能请求

一种解决方案是使用密码管理器来填充这些字段,而无需使用Google的内置存储。
有许多可用的,具有不同程度的跨设备和跨浏览器支持。

或者,您可以编写自己的Tampermonkey脚本来填写这些字段,无论Chrome存储了什么。

如果您确实编写了 Tampermonkey 脚本,我建议您使用安全的存储框架,不要将登录信息硬编码到脚本中。

最新更新