3

我正在开发一个 Chrome 扩展程序,可以在各种站点上生成 XMLHttpRequest,但我注意到我的浏览器忽略了“withCredentials”字段。无论设置为 true 还是 false,响应总是相同的,并且包含通过浏览器的简单 url 导航请求的网页。

显现:

"background": {
    "scripts": ["jquery.min.js", "daemon.js"],
    "persistent": true
},
"permissions": [
    "<all_urls>"
]

daemon.js 内部:

var xhr = new XMLHttpRequest();
xhr.open("GET", 'http://stackoverflow.com/', true);
xhr.withCredentials = false;
xhr.onload = function(e) {
    $('body').html(xhr.responseText);
}
xhr.send();

尽管将 withCredentials 设置为 false,这将返回在某些 DOM 元素中使用我的用户名加载的 stackoverflow.com。我的问题是:

  1. 这是按预期工作的行为吗?
  2. 如果是,是否有解决方法?从扩展内部发出 http 请求但忽略 cookie 或其他会话信息?(更新:忽略所有凭证信息,如客户端证书或 http 身份验证)

我正在使用最新的 (22.0.1229.79 m) Chrome。

4

2 回答 2

2

是的,这(发送凭据的操作)是预期行为。XMLHttpRequest 2 级规范 #withCredentials说(这是本 节的最后一行):

withCredentials 属性在获取同源资源时无效。

显然,在具有足够权限(清单文件)的 Chrome 扩展程序的上下文中运行的代码会导致该属性的行为与请求来自同一来源的行为相同。

我检查了从后台页面获取请求是否解决了任何问题,并得出结论认为它没有帮助。如果其他站点支持 CORS(通过标头),则解决方案是不在"permissions"清单文件的部分提及该站点。此答案中突出显示了所有其他选项。

如果没有一种方法令人满意,那么问题二的答案是“不,没有解决方法”。

于 2012-10-02T12:00:20.130 回答
0

您需要在 Chrome 扩展程序中将 API 端点列入白名单。例子:

{
  "name": "My extension",
  ...
  "host_permissions": [
    "https://stackoverflow.com/"
  ],
  ...
}

请参阅请求跨域权限

于 2021-03-15T12:26:44.733 回答