5

我知道这已经在这里讨论过很多次了,我已经阅读了大部分这些线程,但我似乎无法让我的脚本正常工作。

问题是我正在尝试使用 bitly api 来缩短 google chrome 扩展中的 url。我将用户登录名和 apiKey 保存在本地存储中,在我这样做之前我会验证它们。

这样做的代码是:

$.ajax({
        url:"http://api.bit.ly/v3/validate",
        dataType:'jsonp',
        data:{
            login: login,
            apiKey: apiKey,
            x_login :"test",
            x_apiKey :"test"
        },
        success:function (jo, textStatus, jqXHR) {
            if (jo.status_code == 200) {
                setItem('dg_BitlyApiKey', apiKey);
                setItem('dg_BitlyLogin', login);
                alert('Saved');
            } else {
                alert('Incorrect login and/or apiKey!')
            }
        }
    });

我确实将权限设置为,"permissions": ["tabs", "notifications", "http://*/*", "https://*/*"]但我仍然不断收到:

Refused to load script from 'http://api.bit.ly/v3/validate?callback=jQuery17204477599645033479_1334062200771&login=&apiKey=&x_login=test&x_apiKey=test&_=1334062201506' because of Content-Security-Policy.

脚本本身在扩展之外工作,所以我认为问题不在脚本内,而是在权限范围内。

我在这里做错了什么?

4

3 回答 3

6

问题是您实际上并不是在执行 XHR 请求,而是在对不安全的 HTTP 资源执行 JSONP 请求。请参阅问题如何在扩展弹出窗口中加载外部 JavaScript和相关的Chromium 错误报告

是的,我们不再允许在扩展中使用不安全的脚本。如果您通过 HTTP 加载脚本,活跃的网络攻击者可以将脚本注入您的扩展程序,这是一个安全漏洞。

JSONP 通过在页面中动态添加新的脚本标签然后执行内容来运行。在您的情况下,脚本资源是通过 HTTP(而不是 HTTPS)获取的。如果您的扩展使用第 2 版扩展清单,则其后台页面无法获取非 HTTPS 脚本。

解决方案:如果您通过 HTTPS 使用 Bitly API,我相信这将解决您的问题。 将您的 Ajax 调用发送到https://api-ssl.bitly.com/v3/validate(而不是您的当前值http://api.bit.ly/v3/validate

于 2012-04-10T17:13:30.897 回答
0

您需要打包您的应用程序/扩展程序以使跨域请求工作。托管应用程序将无法执行跨域请求。看:

chrome 扩展中的跨域 XMLHttpRequest

于 2012-04-10T13:04:56.867 回答
0

要在 Chrome 扩展中进行跨域请求,您需要避免在内容脚本中进行跨域获取。

您可以在 https://stackoverflow.com/a/56929473/3680164中找到完整答案

或在文档中 https://www.chromium.org/Home/chromium-security/extension-content-script-fetches

于 2019-07-08T06:38:40.897 回答