我正在开发一个 Chrome 扩展,它在各种网站上生成 XMLHttpRequest,但我注意到我的浏览器忽略了“withCredentials”字段。无论将其设置为 true 还是 false,响应总是相同的,并且包含通过浏览器进行简单 url 导航所请求的网页。
list :
"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,这将返回 stackoverflow.com 在某些 DOM 元素中加载了我的用户名。我的问题是:
- 这是按预期工作的行为吗?
- 如果是,是否有解决方法?从扩展内部发出 http 请求但忽略 cookie 或其他 session 信息? (更新:忽略所有凭证信息,如客户端证书或 http 身份验证)
我使用的是最新的 (22.0.1229.79 m) Chrome。
最佳答案
是的,此(发送凭据的操作) 是预期行为。 XMLHttpRequest level 2 specification #withCredentials说(这是该部分的最后一行):
The withCredentials attribute has no effect when fetching same-origin resources.
显然,在具有足够权限( list 文件)的 Chrome 扩展上下文中运行的代码会导致该属性的行为与请求来自同一来源一样。
我检查过从后台页面获取请求是否解决了任何问题,并得出结论认为它没有帮助。如果其他站点支持 CORS(通过 header ),则解决方案是不要在 list 文件的 "permissions"
部分提及该站点。
所有其他选项都在 this answer 中突出显示.
如果没有一种方法令人满意,那么问题二的答案是“不,没有解决方法”。
关于google-chrome-extension - Chrome 扩展忽略 XMLHttpRequest.withCredentials 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12677608/