打破Chrome/ webex张力沙箱

通过埃文Sangaline|2018年9月14日

WebExtensions对于网页抓取和浏览器自动化的目的,常常低估工具。他们提供了一种简便的方式来访问一个非常强大的API,盒子的跨浏览器兼容的,并且API提供了远远超出更多的专业自动化API,如功能Chrome DevTools协议Firefox的Marionnette。例如,WebExtensions API提供用于包含单个选项卡的机制-Selenium和木偶不能做到这一点!

在Intoli,我们非常喜欢使用webex紧张API进行网络抓取万博输10万怎么办我们建立了一个整体网络自动化框架在此基础上。我们还经常在文章中推荐webex紧张作为其他常见的浏览器自动化框架的补充。这样做才有可能注入JavaScript在页面加载之前,还允许您充分利用特权webex紧张API。最近,当他们的脚本在沙箱环境中运行而遇到限制时,许多人给我们发邮件请求帮助。我们尽了最大的努力来回答这些问题,但是我们认为在这里编写一个明确的指南将是一个好主意,因为这似乎是一个常见的问题。

在本指南中,我们将首先解释一些有关WebExtensions是如何工作的开始,以及如何脚本内容沙盒可能会导致意外和混乱的行为。然后,我们将开发一个可以作为一个插入式解决方案的内容脚本沙箱的突破,这样的代码可以直接在网页本身的上下文中运行代码。与往常一样,你可以找到在成品万博输10万怎么办在GitHub上的intoli- articles -materials资源库如果你想看到所有的作品组合在一起的中端,可以随意跳过那边。而且一定要出演回购,了解从Intoli博客新文章发布前,对其!万博输10万怎么办

理解问题

为了让在WebExtensions快崩溃的时候,他们很不客气包括各种JavaScript的HTML页面的上下文和代码,在这些环境中运行。您可以指定HTML文档和其他资源来填充这些上下文的DOM,但是这主要是切到浏览器自动化。主要上下文的你永远一起工作是背景脚本上下文内容脚本上下文

后台脚本上下文完全由您的扩展拥有,只要您的扩展在运行,它就存在。它有点像您的扩展的控制中心,在这里您将放置代码来管理随时间变化的状态,并在其他上下文中协调代码。内容脚本上下文稍微复杂一些。

你指定URL模式匹配然后,每当浏览器选项卡导航到匹配的URL时,您的代码将被注入并在内容脚本上下文中运行。您可以在该上下文中访问和修改选项卡的DOM,执行您所知道和喜欢的任何常规JavaScript操作,当选项卡关闭或导航到另一个URL时,您的上下文将被破坏。通常看起来代码是在页面上下文中执行的,但实际上不是。

我首先提到背景脚本上下文的部分原因是为了将其与内容脚本上下文进行对比。当您在webex紧张关系文档中了解到这些上下文时,它们之间有一个非常明显的区别,并且有官方批准的机制用于在它们之间进行通信。的runtime.onMessage ()runtime.sendMessage()方法的存在仅仅是为了在不同的扩展上下文之间进行通信,这一点没有歧义。相反,上下文脚本上下文和对应的页面上下文之间的界限是模糊的,很难看到。

让我们通过构建一个用于修改的简单扩展来让这条模糊的线更加清晰window.navigator就像我们一直性质像文章之前完成使无头铬探测不到它是可能检测和阻止铬无头。首先,创建一个名为扩展通过运行

MKDIR扩展

在你的终端。

然后创建一个扩展/ manifest.json文件包含以下内容。

{“manifest st_version”:2、“name”:“Content Script Sandbox Breakout Extension”、“version”:“1.0.0”、“applications”:{“gecko”:{“id”:“Sandbox -breakout@intoli.c万博输10万怎么办om”}}、“content_scripts”:[{“matches”:[””]、“js”:[”Sandbox - Breakout”。run_at: "document_start"}]}

清单文件告诉浏览器如何加载和运行我们的扩展。特别是,content_scripts条目告诉浏览器注入一个名为sandbox-breakout.js在每个页面加载匹配任何URL。设置run_atdocument_start指定应该尽快注入脚本document.readyState等于加载。这确保我们的JavaScript将在我们访问的页面上的任何代码之前被评估。

接下来,创建实际的延伸/沙箱-breakout.js文件包含以下内容。

//覆盖了`navigator.language`属性返回自定义值。常量overwriteLanguage =(语言)=> {Object.defineProperty(导航仪, '语言',{得到:()=>语言,});};//这是不行的,它从页面上下文沙盒。overwriteLanguage( 'XX-XX');

这使用Object.defineProperty ()方法来改变的表观值navigator.language属性XX-XX。我们需要定义属性而不是简单地给它赋值,因为它是现成的,但是代码在其他方面非常简单。当修改浏览器指纹以绕过像Distil和Incapsula这样的僵尸缓解系统时,这种模式非常常见。

正如您可能从代码中的注释中了解到的那样,这并不能完全按照预期工作。要查看实际操作,首先创建一个名为language-test.html这些内容。

  

请等待…