修改 Javascript
Javascript 可以用acorn
或解析esprima
。
结果是ESTree(也称为Mozilla Parser API)格式的 AST。
然后,您可以对 AST 进行修改。estraverse
和其他estools项目可能会有所帮助。
关于对第三方 Javascript 进行自动修改的一些准则:
- 您不希望在代码中抛出错误,向上传播堆栈并影响其他代码。此外,您几乎总是希望收到有关此类错误的通知。因此,您应该用 try-catch 块包围所有注入的代码。
- 如果您在注入的代码中声明变量,您不希望它们干扰其他代码(可能通过
var
提升发生)。因此,您应该将所有注入的代码包装在一个IIFE中。
- 尽量避免在注入的代码中修改任何内容或导致任何副作用。这将使您的修改更难被检测到。
完成后,将 AST 转换回 Javascript 代码escodegen
。
设计代理
因为显然你不能在运行时修改 Javascript,所以你必须在运行前修改它——在它被加载之前。因此,您将需要一个中间人 HTTP 代理。
由于您将使用 Javascript 库,例如acorn
和escodegen
,因此代理也必须用 Javascript 编写。更具体地说,Node.js
浏览器将从代理请求完整的 URL。例如,如果有对 的请求http://www.google.com
,Chrome 会向代理发送如下内容:
GET http://www.google.com HTTP/1.1
Host: www.google.com
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
当代理收到请求时,它应该向源服务器发出相同的请求,沿着它收到的大多数标头进行代理。它应该删除浏览器发送的Host
、Remote-Addr
、Http-Client-IP
和Proxy-Connection
标头,因为它们是为代理准备的。它还应该发送Accept-Encoding: identity
到源服务器,以禁用 HTTP 压缩,这很烦人。
代理下载原始资源后,可以以任何方式对其进行修改,然后再将其发送回浏览器。
配置 Chrome 以使用代理
出于显而易见的原因,您不想永久弄乱系统代理设置或浏览器代理设置。您不希望您的所有网络流量都通过您自己手写的(可能是骇人听闻的)代理传输。
因此,Chrome 扩展 APIchrome.proxy
将对您有所帮助,原因如下:
- 代理只会影响 Chrome,不会影响其他应用程序。
- 您可以使用绕过列表来确保只有某些流量通过代理。
- 您可以随时启用或禁用代理。
要使用此 API,您必须创建自定义 Chrome 扩展程序。
更好的方法:创建一个专用的应用程序
当前的解决方案包括三个组件:
- Chrome,浏览器。
- 代理,一个修改 Javascript 的 Node.js 应用程序。
- 代理配置器,一个告诉 Chrome 使用代理的 Chrome 扩展。
如果您预计所有这一切都会变得非常复杂,您可以使用NW.js为此创建一个专用应用程序。NW.js 用途广泛,您基本上可以将它用作可编程的 Chrome。
这种方法的好处:
- NW.js 禁用受信任代码的跨域策略。因此,您可以创建一个跨域
iframe
(不要忘记添加nwdisable
和nwfaketop
属性),并通过 jQuery 以编程方式与之交互。
- NW.js 支持所有 Node.js API。您可以使代理成为您应用程序的集成部分。您将不再需要担心手动启动和终止它,如果代理是外部 Node.js 应用程序,您就需要这样做。
- NW.js 支持所有 Chrome 扩展 API,包括
chrome.proxy
. 您可以使代理配置器成为您应用程序的集成部分。