webRequest模块的解读
Chrome Extension 的 webRequest模块的解读
文档在此:http://developer.chrome.com/trunk/extensions/webRequest.html
1,为了使用webRequest,首先需要在配置文件manifest.json中加入类似的内容:

{
“name": "My extension",
...
"permissions": {
"webRequest", "*://*.google.com"
},
....
}

这里的意思是说,只允许这个extension对*.google.com的域名使用webRequest,如果这个字符串替换为其它格式的,比如*://*,就可以支持所有的网站访问了。
2,webRequest的核心意思就是要伪造各种request,那么就不单单是写某个对象的数据这么简单,还需要选择合适的时机,在发送某种request之前伪造好它,或者在真实的request到来之后半路截获它,替换成假的然后再发出去。Life cycle of request就是描述这个事情的。
其中,onBeforeSendHeaders这个回调比较有用,文档中如此描述“这个事件将允许extensions添加、修改或删除request headers。简单的用法如下:
chrome.webRequest.onBeforeRequest.addListener(
callback, filter, opt_extraInfoSpec);
a,callback被调用时将被赋予包含request信息的一个参数。
b,filter参数是一个object,有这些key可用:
URLs:类似这种格式的字符串:*://www.google.co/foo*bar
Types:像main_frame或sub_frame,image这样的类型
TabID:tab的标识符
WindowID:window的标识符
3,因为可能多个extension都要玩webRequest,所以需要一套冲突处理机制。如果设置了新的request,刷新页面后是否设置继续有效,设置了之后什么时候有效,这些都是关于cache的问题。另外就是使用timestamp属性的问题,凡从timestamp取得的属性值,相互之间可以比较,但是如果和new Date().getTime()这种方式取得的值比较就不一定对了,需要加以注意。
4,例子
a,阻止所有发往www.evile.com的request
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {cancel: details.url.indexOf("://www.evil.com/") != -1};
},
{urls: ["<all_urls>"]},
["blocking"]);
另一种方法,使用filter:
chrome.webRequest.onBeforeRequest.addListener(
function(details) { return {cancel: true}; },
{urls: ["*://www.evil.com/*"]},
["blocking"])
符合filter的都被cancel掉了。
b,从所有的request中删除User-Agent的header

chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
for (var i = 0; i < details.requestHeaders.length; ++i) {
if (details.requestHeaders[i].name === 'User-Agent') {
details.requestHeaders.splice(i, 1);
break;
}
}
return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]);

5,各种API文档
a,RequestFilter:

RequestFilter = {
tabId: interger, //optional
//URL的数组,或者是匹配URL的pattern
urls: array_of_string,
//可选的值有:"main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"
types: array_of_enumerated_string, //optional
windowId: integer //optional
};
// 设置了blocking关键字的就用这个object来作为block的规则了
BolockingResponse = {
//为true的话request被cancel,在onBeforeRequest里面用哦
cancel: boolean, //optional
//只在onBeforeRequest事件中使用,用来掉包的关键属性!!!
redirectUrl: string, //option
//只用在onHeadersReceived事件里,在浏览器返给server时把header给掉包
responseHeaders: HttpHeaders //optional
//只在onBeforeSendHeaders事件中使用。是另一个用来掉包的关键属性!!!
requestHeaders: HttpHeaders //optional
//只在onAuthRequred事件中使用,当然也是用来掉包的
authCredentials: object //optional
};
HttpHeaders:HTTP headers组成的数组,数组每个元素都有自己的键值对,就是object了。这个得实际打印出来才知道。

b,onBeforeSendHeaders,在TCP连接建立之后和HTTP数据发送之前被调用的事件。调用方法:
chrome.webRequest.onBeforeSendHeaders.addListener(function(object details) {...});
其中,传给callback的参数details结构如下:

details = {
tabId: integer, //如果没有和tab关联则返回-1
parentFrameId: integer,
url: string,
timeStamp: double,
//0表示request是在main frame里发生的
frameId: integer,
requestId: string,
requestHeaders: HttpHeaders, // optional
type: enumerated_string, //value in: ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]
method: string //标准HTTP方法
};

其它事件大同小异,调用callback时传入的参数也都是details这个结构,只是某些字段会有不同的值。
6,总结:webRequest的API非常容易使用,基本上就是第四部分里三个例子的样式。当然, 要想更好地使用,还需要Http Request的一些基础知识,想伪造的话起码要知道应该伪造成什么样子才合适。
转:http://www.zengguanglik.com.cn/2014/1/20/00080.html
webRequest模块的解读的更多相关文章
- Chrome Extension 的 webRequest模块的解读
Chrome Extension 的 webRequest模块的解读 文档在此:http://developer.chrome.com/trunk/extensions/webRequest.ht ...
- FreeSWITCH 加载模块过程解读
今天来学习FreeSWITCH 加载模块过程. 哪些模块需要编译,是由源码下的 modules.conf 文件决定的. 哪些模块在程序启动时自动加载,是由 freeswitch/conf/autolo ...
- #6 ipdb模块源代码解读
前言 好久不见,大家最近可好
- Django权限和认证模块的解读
from rest_framework.views import APIView 找到APIView中的dispatch方法 class MyAuth: def authenticate(self): ...
- 三分钟解读springmvc依赖
长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套用,项目做过几个,但框架的内涵却没有把握.小编打算今天从SpringMVC的依赖分析做起,一步步进行 ...
- SocketServer模块,hmac模块验证client合法性
hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...
- Spring框架jar包分类(转)
转自:http://www.cnblogs.com/JSONBEAN/p/6364038.html 长期以来都在写SSM框架的项目,却未能深入理解框架的搭建原理,而只是浅薄的理解前辈的架构,然后不断套 ...
- Chrome插件开发(二)
作为一个前端开发者,我们经常需要和各种各样的接口打交道,很多时候我们的开发环境的域和接口所在的域是不同的,比如我们本地开发环境运行域是localhost,但接口所在的域是www.xx.com,这个时候 ...
- Certified Scrum Master CSM 中文资料大全
课程概览 本课程由中国唯一一位获CST认证培训师及LeSS-Friendly Scrum Trainer双重认证讲师,丰富一线实战经验的Scrum教练讲授:姜信宝 BoB Jiang. 敏捷变革中心是 ...
随机推荐
- menu JPopupMenu JTabbedPane
菜单是GUI中最常用的组件,菜单不是Component类的子类,不能放置在普通容器中,不受布局管理器的约束,只能放置在菜单栏中. 菜单组件由菜单栏 (MenuBar).菜单(Menu)和菜单项(Men ...
- centos 装 android studio
一.安装前的准备 1.1.如果你还没有安装ubuntu 14.04 LTS系统,请参考下面的文章安装 http://blog.csdn.net/lsyz0021/article/details/521 ...
- Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is less than or equal to the length of the linked list. If the number of
class Solution { public: ListNode *reverseKGroup(ListNode *head, int k) { if (!head || !(head->ne ...
- move_uploaded_file failed to open stream permission denied
Make sure that: IWPG_user, where user is a system user of the subscription who has rights to "R ...
- Course Machine Learning Note
Machine Learning Note Introduction Introduction What is Machine Learning? Two definitions of Machine ...
- system sys,sysoper sysdba 的区别
--===================================== -- system sys,sysoper sysdba 的区别 --========================= ...
- struts2知识系统整理
1.MVC 和 JSP Model 2 ** a.:M-Model 模型 包含两部分:业务数据和业务处理逻辑 b.V-View 视图:视图(View)的职责是负责显示界面和用户交互(收集用户信息 ...
- 九度oj 题目1352:和为S的两个数字
题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入: 每个测试案例包括两行: 第一行包含一个整数n和k, ...
- [BZOJ2118] 墨墨的等式(最短路)
传送门 好神啊.. 需要用非负数个a1,a2,a3...an来凑出B 可以知道,如果一个数x能被凑出来,那么x+a1,x+a2.......x+an也都能被凑出来 那么我们只需要选择a1~an中任意一 ...
- spring两个核心IOC、AOP
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 ...