V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Get Google Chrome
Vimium · 在 Chrome 里使用 vim 快捷键
wuhx
V2EX  ›  Chrome

想写这样一个 chrome 插件:在 post 数据到服务器之前,弹出一个界面,用户可以修改 post 的数据,确认后再发送。

  •  
  •   wuhx · 2014-05-03 22:19:53 +08:00 · 7098 次点击
    这是一个创建于 3863 天前的主题,其中的信息可能已经有所发展或是发生改变。
    搜索了一圈,发现chrome有webrequst和declarativeWebRequest的api可以在发送request之前做点hook。

    参照官方栗子写了个测试插件
    https://developer.chrome.com/extensions/webRequest#event-onBeforeRequest

    chrome.webRequest.onBeforeRequest.addListener(
    function(info) {
    if(info.method == "POST") {
    info['requestBody']['formData']['pwd'] = "Hello"
    alert("POSTING:" + JSON.stringify(info.requestBody.formData.pwd))
    }
    return {redirectUrl: info.url};
    },
    {urls: ["*://*/*"]},
    ["blocking", "requestBody"]);

    可以看到post的数据,也能修改。 但是尼玛,没有办法把修改后的数据传递出去啊,return类型只有重定向和取消requset!

    还能有其他什么方法吗?或者oprea,firefox上可以也行。
    13 条回复    2014-05-04 21:21:07 +08:00
    csx163
        1
    csx163  
       2014-05-03 22:43:59 +08:00
    fiddler
    sneezry
        2
    sneezry  
       2014-05-03 22:44:21 +08:00
    LZ变通一下啦,你POST的数据更改后自己加个标注字段,比如_modified=1,然后你的扩展block的时候判断一下,如果有这个字段就放行啦
    zjgood
        3
    zjgood  
       2014-05-03 22:52:42 +08:00 via Android
    @csx163 fidller +1,这货明显比插件更有效率
    Shieffan
        4
    Shieffan  
       2014-05-03 23:03:51 +08:00 via iPad
    之前我研究过,Chrome目前只能修改request跟response的header,不能修改body,应该没有绕过的办法
    Aphsss
        5
    Aphsss  
       2014-05-04 08:36:54 +08:00
    burpsuite
    sneezry
        6
    sneezry  
       2014-05-04 08:41:12 +08:00 via iPhone
    @Shieffan 可以先block,修改完再提交一遍啊。
    Shieffan
        7
    Shieffan  
       2014-05-04 08:47:34 +08:00 via iPhone
    @sneezry 撸主说了,block之后只能redirect或cancel,怎么再提交,这又不是修改DOM
    sneezry
        8
    sneezry  
       2014-05-04 08:49:39 +08:00 via iPhone
    @Shieffan cancel啊,然后修改完点确定就还是submit重新提交。
    Shieffan
        9
    Shieffan  
       2014-05-04 08:53:33 +08:00 via iPhone
    @sneezry 那这次提交的跟上次会有任何区别么?Dom内容又没变,提交的还不是一样
    sneezry
        10
    sneezry  
       2014-05-04 09:03:50 +08:00 via iPhone
    @Shieffan 不对的,return cancel之前可以做很多事,比如重新构造一个Ajax提交数据,再或者给出一个浮动层里面重新给出一个form。而重新提交时可以新定义一个对服务器无意义的字段,或者增加一个header来让扩展识别是否是修改过的提交,避免扩展将修改过的提交也屏蔽掉。
    Shieffan
        11
    Shieffan  
       2014-05-04 09:27:08 +08:00
    @sneezry 是可以通过发消息等方式修改tab的dom结构,但是我觉得这样并不能实现LZ的需求,在http body里面修改post的表单内容跟直接修改DOM来修改post内容完全是不同级别的难度,post数据的方式五花八门,可以有form,可以没form,可以是提取dom元素进行计算组合,可以混合进JS变量,我觉得根本没办法进行统一处理。
    wuhx
        12
    wuhx  
    OP
       2014-05-04 12:41:56 +08:00
    多谢各位的回复

    fiddler看起来相当强悍,只是mac下mono的界面太惨不忍睹了,有空再研究一下。

    @sneezry @Shieffan 两位比较专业,我属于js还没入门的,我理解sneezry的思路是:在cancel之前主动把修改后的数据POST到服务。理论上应该可行吧。

    另外,其实我自己想到的方案是:修改chrome代码,自己实现这个api,但是估计工作量很大,重在折腾了。
    wuhx
        13
    wuhx  
    OP
       2014-05-04 21:21:07 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2897 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:39 · PVG 11:39 · LAX 19:39 · JFK 22:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.