防止浏览器扩展注入Javascript代码

时间:2012-09-19 12:11:29

标签: javascript internet-explorer firefox google-chrome browser

浏览器允许扩展注入代码,操纵DOM等。

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

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

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

可能的变通办法(一种拉伸与简单的元标记),由他人或我的头脑建议:

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

修改:Google Chrome会在隐身模式下停用扩展程序,但是,没有标准方法可以检测或自动启用隐身模式,因此必须显示永久警告。

6 个答案:

答案 0 :(得分:13)

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

最后,用户负责确保他们在进行网上银行交易时拥有干净的操作系统。用户遭到入侵并不是网站的错误

<强>更新 我们应该把事情搞砸。 类似的东西:

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

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

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

答案 1 :(得分:5)

这不是一个完整的解决方案,但您可以使用javascript提示绕过密钥日志记录。我写了一个小测试用例(结果有点失控)。此测试用例执行以下操作:

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

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

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

答案 2 :(得分:2)

这不会起作用,但我会尝试围绕document.createElement = function(){}; 这应该会影响客户端脚本(greasemonkey)

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

=&GT;页面应该看起来像

<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元素),但这意味着在浏览器中创建一个浏览器。 p>

答案 3 :(得分:2)

你的问题很有意思,也很贴心(+ 1),但不幸的是,提议的安全性并没有提供真正的安全性,因此没有浏览器会实现它。

浏览器/网络/网络安全的核心原则之一是抵制实施虚假安全功能的愿望。使用该功能的网络不如没有安全!

听我说:

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

<meta>标记停止注入扩展确实使网站更健壮,但不是更安全。编写强大的JavaScript有一千种方法,而不是祈祷没有邪恶的扩展。隐藏您的全局函数/对象,并将环境健全性检查作为另一个。例如,GMail检查Firebug。许多网站都会检测到广告拦截。

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

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

答案 4 :(得分:1)

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

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

需要考虑的其他事项:编写自己的扩展程序。使Firefox扩展非常简单+你可以重用很多JavaScript代码,因为它也可以使用JavaScript。我从未写过谷歌浏览器或MSIE扩展程序,但我认为这并不困难。但是您不需要将其转换为防病毒扩展。有了这些可用的工具,你就可以做到这一点,这样任何其他扩展都无法窃听你自己的扩展内容。我不确定你的观众会对你有多友好,但是如果你的目标是企业界,那么那些观众在某种程度上是非常好的,因为他们无法选择他们的工具......所以你可以只是强迫他们使用扩展名。

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

答案 5 :(得分:1)

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

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

很明显,你会遇到性能问题,但那是你的安全性的折衷。

任何参赛者?