【问题标题】:Sending AJAX from Chrome Extension从 Chrome 扩展发送 AJAX
【发布时间】:2014-10-13 19:29:01
【问题描述】:

我想创建一个可以使用XMLHttpRequest 发送 AJAX 调用的 Chrome 扩展程序。我向它发送请求的网站不是我的。

当网站收到 AJAX 调用时,它会检查请求的 Referer 标头。如果我从后台页面(Chrome 扩展程序)发送 AJAX,则不会发送 Referer 标头,并且请求被拒绝。

如何更改背景页面中的Referer 标头?

【问题讨论】:

    标签: javascript ajax google-chrome google-chrome-extension


    【解决方案1】:

    您应该能够使用webRequest API 拦截您自己的请求并修改请求标头。

    具体来说,以阻塞的方式监听chrome.webRequest.onBeforeSendHeaders,编辑headers对象,返回覆盖headers。

    并非所有标题都可以通过这种方式修改,但Referer 可以。

    【讨论】:

    • 您能否举例说明我如何听取我的请求?
    • 好问题;可能你不能。但是您可以通过 URL 模式进行初级过滤,然后仅在 Referrer 为空时修改它。
    • chrome.webRequest.onBeforeSendHeaders 不会捕获从 Chrome 扩展程序发送的请求。
    • 您的请求是否同步?如果是,那么您将无法拦截它们。您还需要主机权限。
    【解决方案2】:

    如 Xan 的回答中所述,您需要使用 webRequest API。由于我喜欢答案中的最少示例,因此这里有一个:

    manifest.json 权限需要包含:

    "permissions": [
        "*://target.site/", 
        "webRequest",
        "webRequestBlocking"
    ]
    

    修改请求以包含任意referer的js代码:

    callback = function(details) {
        details.requestHeaders.push({
            name: 'Referer',
            value: 'http://your.arbitrary.referer'
        });
        return {
            requestHeaders: details.requestHeaders
        };
    };
    
    filter = { urls: ["*://target.site/target.html"] };
    opts = ['blocking', 'requestHeaders']
    chrome.webRequest.onBeforeSendHeaders.addListener(callback, filter, opts);
    

    当浏览器现在向*://target.site/target.html 发出请求时,引用者将被设置为http://your.arbitrary.referer。这对用户完成的请求(通过单击链接或在执行 AJAX 请求的站点上)以及您自己的扩展程序的 AJAX 请求生效。

    【讨论】:

    • 我真的不明白为什么 chrome 不允许更改 AJAX 请求中的 Referer-header。他们甚至可以要求额外的权限,称为arbitraryReferer
    • 你真的让我很开心!
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2012-08-18
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多