防止注入浏览器扩展的Java脚本代码

问题描述 投票:29回答:6

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

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

这些错误似乎并没有中断任何事情。现在,我想提高此网站的安全性,因为它将开始处理信用卡。我亲眼目睹了恶意软件/间谍软件以修改后的浏览器扩展(无辜的浏览器扩展,经过修改以向攻击者/脚本小子报告)感染浏览器,并充当了键盘记录程序(使用琐碎的onkey *事件处理程序,或者只是input.value检查)。] >

是否有一种方法(元标记等)通知浏览器以禁止代码注入或读取DOM(标准或非标准DOM?

该网页已经是SSL,但这似乎无关紧要(如提示浏览器激活更严格的扩展安全性)。

可能的解决方法

(有点困难,而不是简单的元标记)是别人建议的,或者是我脑袋上方的建议:
  • 用于输入数字和非文本输入的虚拟键盘(又名数字img)
  • 使用Flash的远程桌面(有人建议使用HTML5,但这不能解决浏览器扩展监听键盘事件的问题;只有Flash,Java等可以。)>
  • 非常复杂的基于Javascript的保护(删除非白名单的事件侦听器,内存输入值以及受实际星号字符保护的输入等)(不可行,除非它已经存在)
  • 具有防病毒功能或可以某种方式保护特定网页的浏览器扩展(这是不可行的,甚至可能在不产生大量问题的情况下也无法实现)
  • 编辑:Google Chrome在隐身模式下禁用扩展,但是,没有标准方法可以检测或自动启用隐身模式,因此必须显示永久警告。

浏览器允许扩展程序注入代码,操纵DOM等。这些年来,我注意到我正在监视,生成的网站(应用程序)上出现了很多未解决的错误(使用window.onerror)。]] >

UPDATE(2019-10-16):

这不是一个“真实的”解决方案-意味着您不应将其作为安全策略。事实是,没有“真正的”解决方案,因为恶意插件会以无法检测的方式劫持/欺骗JavaScript。下面的技术对我来说是一项练习,目的是弄清楚如何防止简单的键记录。您可以扩展此技术,使其对黑客来说更加困难...但是Vlad Balmos said it best in his answer below-不要浪费您的精力来掩盖那些最初不打算通过Internet进行付款的用户。] >

您可以通过使用javascript提示来避免按键记录。我写了一个小测试用例(最终有些失控)。该测试用例执行以下操作:

  • 使用prompt()来重点索取信用卡号。
  • 当用户选中“防止其他对话框”或如果用户能够以某种方式在“抄送”字段中键入时,提供故障保护
  • [定期检查以确保未删除或欺骗事件处理程序,并在必要时重新绑定/警告用户。

    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)中进行了测试

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

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

    UPDATE

    我们应该总结一下。类似于:
    <meta name="disable-extension-feature" content="read-dom" />
    

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

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

    您的问题很有趣,而且很周到(+1),但是不幸的是,建议的安全性不能提供真正的安全性,因此,没有浏览器可以实现它。

    关于浏览器/网络/网络安全的核心原则之一是抵制实现虚假安全功能的愿望。使用此功能将比没有使用Web安全性低!

    听我说:

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

    <meta>标签停止注入的扩展确实使网站更强大,但并不更安全。比起祈求没有邪恶的扩展,有上千种方法来编写健壮的JavaScript。隐藏全局功能/对象是其中的一个,并执行环境健全性检查。例如,GMail检查Firebug。许多网站检测到广告屏蔽。

    <meta>标签确实在隐私方面有意义(同样,不是

    安全性)。应该有一种方法告诉浏览器,DOM中当前存在的信息是敏感的(例如我的银行余额),并且不应暴露给第三方。但是,如果用户使用供应商A的操作系统,供应商B的浏览器,供应商C的扩展名而没有仔细阅读其源代码以了解他们的所作所为,则该用户已经表示了对这些供应商的信任。您的网站在这里不会出错。真正关心隐私的用户将转向他们信任的操作系统和浏览器,并使用浏览器的其他配置文件或私有模式来查看其敏感信息。

    结论:

    如果在服务器端再次进行所有输入检查,则您的网站足够安全,没有<meta>标签可以使它更安全。干得好!
    我看到很多次类似的事情,尽管保护是通过另一种方式进行的:许多站点以文本形式提供敏感信息时,会使用Flash小部件来显示文本(例如, -mail地址,否则该地址会被漫游器发现并发送给垃圾邮件)。

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

    要考虑的其他事项:编写自己的扩展程序。使Firefox扩展非常容易+您可以重用许多JavaScript代码,因为它也可以使用JavaScript。我从未写过Google Chrome或MSIE扩展程序,但我想这并不困难。但是您无需将其变成防病毒扩展。使用可用的工具,您可以做到这一点,从而使其他扩展程序都无法窃听自己扩展程序中正在发生的事情。我不确定您的听众会对此表示欢迎,但是如果您针对公司部门,那么在某种程度上,该听众是一个很好的听众,因为他们没有选择他们的工具...所以您可以让他们使用扩展名。

    还有其他想法吗? -好吧,这是[[very

    简单而有效的方法:让用户打开一个弹出窗口/单独的选项卡并禁用其中的JavaScript :)我的意思是,如果使用JavaScript,您可以拒绝接受信用卡信息在浏览器中启用-很明显,这很容易检查。这将需要用户花些心思才能找到该设置,他们可以在此处禁用它+他们将在弹出窗口上肆虐...但是几乎可以肯定的是,这将禁用所有代码注入:)

    这不会起作用,但是我会尝试围绕document.createElement = function(){};那应该影响客户端脚本(greasemonkey)
    您也可以尝试使用隐藏的输入来提交当前DOMmyform.onsubmit=function(){myform.hiddeninput.value=document.body.innerHTML;}并检查服务器端是否有不需要的DOM元素。我想在每个元素上使用服务器端生成的ID /令牌可以在这里有所帮助(因为注入的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元素),但这意味着在浏览器中创建浏览器。

    而且我们都知道我们无法从代码中显式阻止扩展,另一种方法是找到与键字段(例如,password,ssn)相关的事件侦听器的列表,以及诸如keypress,keyup,keydown等主体上的事件,并验证侦听器是否属于您的代码(如果不是只是将Flash消息禁用)插件。
    并且您可以将突变事件附加到页面上,并查看代码之外,是否还有其他第三方正在创建/生成新节点。

    显而易见,您会遇到性能问题,但这就是安全性的折衷。

    任何参与者?

    javascript internet-explorer firefox google-chrome browser
    6个回答
    5
    投票

    UPDATE(2019-10-16):

    这不是一个“真实的”解决方案-意味着您不应将其作为安全策略。事实是,没有“真正的”解决方案,因为恶意插件会以无法检测的方式劫持/欺骗JavaScript。下面的技术对我来说是一项练习,目的是弄清楚如何防止简单的键记录。您可以扩展此技术,使其对黑客来说更加困难...但是Vlad Balmos said it best in his answer below-不要浪费您的精力来掩盖那些最初不打算通过Internet进行付款的用户。] >

    14
    投票

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

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

    UPDATE

    我们应该总结一下。类似于:

    2
    投票

    您的问题很有趣,而且很周到(+1),但是不幸的是,建议的安全性不能提供真正的安全性,因此,没有浏览器可以实现它。

    关于浏览器/网络/网络安全的核心原则之一是抵制实现虚假安全功能的愿望。使用此功能将比没有使用Web安全性低!

    听我说:

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


    1
    投票
    我看到很多次类似的事情,尽管保护是通过另一种方式进行的:许多站点以文本形式提供敏感信息时,会使用Flash小部件来显示文本(例如, -mail地址,否则该地址会被漫游器发现并发送给垃圾邮件)。

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

    要考虑的其他事项:编写自己的扩展程序。使Firefox扩展非常容易+您可以重用许多JavaScript代码,因为它也可以使用JavaScript。我从未写过Google Chrome或MSIE扩展程序,但我想这并不困难。但是您无需将其变成防病毒扩展。使用可用的工具,您可以做到这一点,从而使其他扩展程序都无法窃听自己扩展程序中正在发生的事情。我不确定您的听众会对此表示欢迎,但是如果您针对公司部门,那么在某种程度上,该听众是一个很好的听众,因为他们没有选择他们的工具...所以您可以让他们使用扩展名。

    还有其他想法吗? -好吧,这是[[very

    简单而有效的方法:让用户打开一个弹出窗口/单独的选项卡并禁用其中的JavaScript :)我的意思是,如果使用JavaScript,您可以拒绝接受信用卡信息在浏览器中启用-很明显,这很容易检查。这将需要用户花些心思才能找到该设置,他们可以在此处禁用它+他们将在弹出窗口上肆虐...但是几乎可以肯定的是,这将禁用所有代码注入:)

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

    =>页面应该看起来像

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


    1
    投票
    并且您可以将突变事件附加到页面上,并查看代码之外,是否还有其他第三方正在创建/生成新节点。

    显而易见,您会遇到性能问题,但这就是安全性的折衷。

    任何参与者?

    © www.soinside.com 2019 - 2024. All rights reserved.