31

浏览器允许扩展注入代码、操作 DOM 等。

多年来,我在我正在观看的网站(应用程序)上注意到许多和各种未捕获的错误(使用 window.onerror),这些错误是由 Firefox、Chrome 和 Internet Explorer(所有版本)上的未知浏览器扩展生成的。

这些错误似乎并没有中断任何事情。现在我想增加这个网站的安全性,因为它将开始处理信用卡。我亲眼看到恶意软件/间谍软件使用修改过的浏览器扩展(无辜的浏览器扩展,修改为向攻击者/脚本小子报告)作为键盘记录器(使用微不足道的 onkey* 事件处理程序,或只是 input.value 检查)感染浏览器。

有没有办法(元标记等)通知浏览器禁止代码注入或读取标准或非标准 DOM?该网页已经是 SSL,但这似乎并不重要(如提示浏览器激活更严格的扩展安全性)。

.

其他人建议的或我想到的可能的解决方法(一种延伸与简单的元标记):

  • 用于输入数字的虚拟键盘 + 非文本输入(又名 img 用于数字)
  • 使用 Flash 的远程桌面(有人建议使用 HTML5,但这并不能解决监听键盘事件的浏览器扩展;只有 Flash、Java 等可以)。
  • 非常复杂的基于 Javascript 的保护(删除非白名单事件侦听器、内存中的输入值以及受实际星号字符保护的输入等)(不可行,除非它已经存在)
  • 具有防病毒作用或可以以某种方式保护特定网页的浏览器扩展(这是不可行的,甚至可能在不产生大量问题的情况下都不可能)

编辑:谷歌浏览器在隐身模式下禁用扩展,但是,没有标准的方法来检测或自动启用隐身模式,因此必须显示永久警告。

4

6 回答 6

14

能够禁用某人的浏览器扩展通常意味着接管浏览器。我不认为这是可能的。这将是一个巨大的安全风险。您的目的可能是合法的,但请考虑网站管理员以编程方式为用户禁用 addblocker 以让他们查看广告的场景。

最后,用户有责任确保他们在进行网上银行交易时拥有干净的操作系统。用户受到损害不是网站的错

更新 我们应该总结一下。就像是:

<meta name="disable-extension-feature" content="read-dom" />

或者

<script type="text/javascript">
    Browser.MakeExtension.MallwareLogger.to.not.read.that.user.types(true);
</script>

不存在,我相信在不久的将来不会实施。使用任何必要的手段来最好地利用当前最新的现有技术并尽可能安全地设计您的应用程序。不要浪费你的精力来覆盖那些一开始就没有通过互联网付款的用户

于 2012-09-19T12:21:32.590 回答
5

更新(2019-10-16):这不是一个“真正的”解决方案——这意味着你不应该依赖它作为安全策略。事实是,没有“真正的”解决方案,因为恶意插件可以以无法检测到的方式劫持/欺骗 JavaScript。下面的技术对我来说更像是一种练习,以弄清楚如何防止简单的按键记录。您可以扩展此技术以使黑客更难...第一名。


您可以使用 javascript 提示符绕过密钥记录。我写了一个小测试用例(最终有点失控)。此测试用例执行以下操作:

  • 使用prompt()来询问焦点所在的信用卡号。
  • 当用户选中“防止附加对话框”或用户能够以某种方式在 CC 字段中键入时提供故障保护
  • 定期检查以确保事件处理程序没有被删除或欺骗,并在必要时重新绑定/警告用户。

http://jsfiddle.net/ryanwheale/wQTtf/

prompt('Please enter your credit card number');

在 IE7+、Chrome、FF 3.6+、Android 2.3.5、iPad 2 (iOS 6.0) 中测试

于 2012-09-28T10:05:42.953 回答
2

您的问题很有趣,也很周到(+1'd),但不幸的是,提议的安全性并没有提供真正的安全性,因此没有浏览器会实现它。

浏览器/网络/网络安全的核心原则之一是抵制实现虚假安全功能的愿望。使用该功能的 Web 将比不使用该功能更不安全!

听我说:

在客户端执行的一切都可以被操纵。浏览器只是另一个与服务器对话的 HTTP 客户端;服务器永远不应该相信计算结果,或者在前端 Javascript 中完成的检查。如果有人可以简单地绕过您在带有扩展程序的浏览器中执行的“安全”检查代码,他们肯定可以将 HTTP 请求直接发送到您的服务器curl以执行此操作。至少,在浏览器中,熟练的用户可以转向 Firebug 或 Web Inspector 并绕过您的脚本,就像您在调试网站时所做的那样。

阻止扩展注入的<meta>标签确实使网站更健壮,但不是更安全。编写健壮的 JavaScript 有上千种方法,而不是祈祷没有邪恶的扩展。将您的全局函数/对象隐藏为其中之一,并执行环境健全性检查作为另一个。例如,GMail 检查 Firebug。许多网站检测到广告屏蔽。

<meta>标签在隐私方面确实有意义(同样,不是安全性)。应该有一种方法可以告诉浏览器当前存在于 DOM 中的信息是敏感的(例如我的银行余额)并且不应该暴露给第三方。然而,如果用户使用供应商 A 的操作系统、供应商 B 的浏览器、供应商 C 的扩展程序而没有阅读其源代码以确切知道他们在做什么,则用户已经表明他对这些供应商的信任。您的网站在这里不会出错。真正关心隐私的用户会转向他们信任的操作系统和浏览器,并使用浏览器的其他配置文件或隐私模式来检查他们的敏感信息。

结论:如果您(再次)在服务器端进行所有输入检查,您的网站就足够安全,没有任何<meta>标签可以使其更安全。做得好!

于 2012-09-26T09:19:36.113 回答
1

我看到类似的事情发生了很多次,尽管保护是以另一种方式进行的:相当多的网站,当他们以文本形式提供敏感信息时,会使用 Flash 小部件来显示文本(例如,电子邮件地址,否则会被机器人发现并发送垃圾邮件)。

Flash 小程序可以配置为拒绝来自 HTML 页面的任何代码,实际上,除非您特别期望这是可能的,否则它不会开箱即用。Flash 也不会重新向浏览器发送事件,因此如果键盘记录器在浏览器级别上工作,它将无法记录按下的键。当然,Flash 有其自身的缺点,但考虑到所有其他选项,这似乎是最可行的选项。因此,您不需要通过 Flash 进行远程桌面,简单的嵌入式小程序也一样好。此外,单独使用 Flash 不能用于制作功能齐全的远程桌面客户端,您可能会考虑使用 NaCl 或 JavaFX,这将使其只能由企业用户使用,最终只能由私人用户使用。

其他需要考虑的事情:编写自己的扩展。制作 Firefox 扩展真的很容易 + 你可以重用大量的 JavaScript 代码,因为它也可以使用 JavaScript。我从未编写过 Google Chrome 或 MSIE 扩展程序,但我想这并不难。但是您不需要将其变成防病毒扩展程序。使用可用的工具,您可以做到这一点,这样其他扩展就无法窃听您自己的扩展内部正在发生的事情。我不确定你的听众会多么友好,但如果你的目标是企业部门,那么在某种程度上,这个听众是一个非常好的听众,因为他们无法选择他们的工具......所以你可以强制他们使用扩展名。

还有什么想法吗?- 嗯,这个非常直接和高效:让用户打开一个弹出窗口/单独的选项卡并禁用其中的 JavaScript :) 我的意思是,如果 JavaScript 被启用,你可以拒绝接受信用卡信息浏览器 - 显然,它很容易检查。这需要用户付出一些脑力才能找到设置,他们可以在其中禁用它+他们将在弹出窗口中肆虐......但几乎可以肯定这将禁用所有代码注入:)

于 2012-09-22T00:45:21.373 回答
1

这行不通,但我会尝试一下 document.createElement = function(){}; 这应该会影响客户端脚本(greasemonkey)

您还可以尝试使用隐藏输入提交当前 DOM myform.onsubmit=function(){myform.hiddeninput.value=document.body.innerHTML;}并检查服务器端是否存在不需要的 DOM 元素。我想在每个元素上使用服务器端生成的 id/token 会有所帮助(因为注入的 DOM 节点肯定会错过它)

=> 页面应该看起来像

<html uniqueid="121234"> <body uniqueid="121234"><form  uniqueid="121234"> ...

因此,在 POST 操作中查找未跟踪的元素应该很容易(例如使用 xpath)

<?php
simplexml_load_string($_POST['currentdom'])->xpath("*:not(@uniqueid)") //style

关于 DOM 注入问题的一些东西。

至于键盘记录部分,我认为您无法从客户端的角度阻止键盘记录器(使用虚拟键盘等除外),因为无法从浏览器内部识别它们。如果您是偏执狂,您应该尝试 100% 画布生成设计(模仿 HTML 元素和交互),因为这可能会保护您(没有要绑定的 DOM 元素),但这意味着在浏览器中创建浏览器。

于 2012-09-24T23:02:14.600 回答
1

而且我们都知道我们不能显式阻止代码中的扩展,另一种方法是查找附加到密码、ssn 等关键字段的事件侦听器列表,以及 keypress、keyup、keydown 等主体上的事件,并验证是否侦听器属于您的代码,如果不只是抛出一个 Flash 消息来禁用插件。

您可以将突变事件附加到您的页面,看看是否有一些新节点正在由第三方创建/生成,除了您的代码。

好的,很明显您会遇到性能问题,但这是对您的安全性的权衡。

任何接受者?

于 2012-09-28T05:27:08.707 回答