你可以尝试各种各样的事情,但它们都不会有意义地做任何事情。例如,您可以截取每个键入的字符,将其存储在 JS 变量中,然后在输入中将其替换为无意义的内容。读取输入的值不会让攻击者得到任何东西,但他们可以只读取 JS 变量。您可以通过将变量放在一个没有读取功能的私有闭包中来隐藏变量 - 只有一个在输入密码时更新密码,一个将其发送到服务器 - 但这不会对做相同类型的人隐藏它事物,实时监控击键或输入的变化。您可以尝试弄乱 DOM 中的属性访问器。具体来说,覆盖value在输入元素上使其不返回实际值是可能的,并且可能是 BoA 所做的。它实际上并没有增加任何真正的安全性,因为有很多其他方法可以监控击键等或提取完整密码。一些方法:获取outerHTML输入或任何包含元素或innerHTML任何包含元素的JS 可读的密码输入,其中一个 JS 可以读取(在用户开始键入之前),或者...
一种选择可能是对实际登录表单使用沙盒 iframe。类似的东西<iframe sandbox="allow-forms allow-top-navigation-by-user-activation"... >会阻止脚本执行并阻止父级读取框架内容。将登录表单和所有动态生成的内容(可能会受到 XSS)放在 iframe 内加载的页面上。添加一个脚本,如果脚本完全被允许(它们不会在沙箱内),则立即将用户导航出去,并使用X-Frame-Options和/或 CSPframe-ancestors来防止第三方页面在 iframe 中加载登录页面。在 iframe 中,你可以有一个标准的 HTML 表单,并给它一个target="_top"属性使其在顶级上下文中加载登录结果。由于沙箱,任何注入的脚本(通常是 XSS)都不会运行。(当然,出于同样的原因,其他脚本也不会,因此您的登录表单将不得不应对)。不要在父页面(脚本工作的地方)中放置任何动态内容,因为即使密码输入不在脚本工作区域中,父页面中的 XSS 也可以替换或编辑整个 iframe 更适合窃取您的数据。
或者你可以做一些合理的事情,停止追逐保护特定输入字段免受 XSS 攻击的附带好处(毕竟大多数 XSS 发生在身份验证之后)。保持登录页面简单。不要使用外部脚本(或任何脚本,除非它们与登录的基本功能直接相关)。如果您能提供帮助,请不要使用任何用户提供的输入;如果由于某种原因您无法提供帮助,请确保其输出已编码,并且可能已对输入进行了良好的验证。不要进行任何可能启用基于 DOM 的 XSS 的 DOM 修改。添加高度限制性的CSP(对于这样一个干净的页面来说应该很容易)以进行深度防御。瞧:您的密码输入受到 XSS 保护。