Javascript 在firefox上通过插件启用CORS会导致错误

Javascript 在firefox上通过插件启用CORS会导致错误,javascript,firefox,http-headers,firefox-addon,Javascript,Firefox,Http Headers,Firefox Addon,我的代码可以工作,但并不总是像它应该的那样,例如你不能在facebook上聊天 var MYADDON_CSP_listener = { observe : function(aSubject, aTopic, aData) { if (aTopic == "http-on-examine-response") { let url; aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); url

我的代码可以工作,但并不总是像它应该的那样,例如你不能在facebook上聊天

var MYADDON_CSP_listener = {
observe : function(aSubject, aTopic, aData) {
  if (aTopic == "http-on-examine-response") {
    let url;

    aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
    url = aSubject.URI.spec;
    var headers=["Content-Security-Policy: ","Access-Control-Allow-Origin: *","Access-Control-Allow-Methods: POST,GET,DELETE,PUT","Content-Security-Policy-Report-Only: ","X-Content-Security-Policy: ","X-WebKit-CSP: ","X-Frame-Options: ","X-XSS-Protection: 0"];
        for(i=0;i<headers.length;i++)
        {
        bol=headers[i].split(': ');
        aSubject.setResponseHeader(bol[0],bol[1], false);
        }
        //aSubject.setResponseHeader("content-security-policy", '', false);
  }
}
};
var MYADDON_observerService = Components.classes["@mozilla.org/observer-service;1"]
                                .getService(Components.interfaces.nsIObserverService);
MYADDON_observerService.addObserver(MYADDON_CSP_listener, "http-on-examine-response", false);
当响应头包含“访问控制允许凭据”时会发生这种情况


当存在标题“Access Control Allow Credentials”时,您不能将Access Control Allow Origin作为*发送,但不确定为什么这在所有浏览器中都是一个问题Mozilla文档中说:

当响应认证请求时,服务器必须指定域,并且不能使用通配符

此外:

origin参数指定可以访问资源的URI。浏览器必须强制执行此操作。对于没有凭据的请求,服务器可以将“*”指定为通配符,从而允许任何来源访问资源

资料来源:

您的代码始终设置
访问控制允许源代码:
无论在何种情况下,在这种情况下都应该失败。 检查您的请求是否包含
Origin
标题,您应该在
访问控制允许Origin
中使用其值

更新1 如何使用
原点
标题的示例:

observerHandler : { observe : function(subject, topic, data) {

   // http interface
   var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
   if(httpChannel == null) {
      return;
   }


   // check origin header
   // was throwing an exception necessary if header is not set, mozilla ?
   var origin;
   try {
      origin = httpChannel.getRequestHeader('Origin');
   } catch(e) {}

   if(!origin) {
      origin = '*';
   }


   // check response header
   // was throwing an exception necessary if header is not set, mozilla ?
   var header;
   try {
      header = httpChannel.getResponseHeader('Access-Control-Allow-Origin');
   } catch(e) {}


   // abort if header has cors already
   if(header == '*' || header == 'null') {
      return;
   }


   // force cross origin
   httpChannel.setResponseHeader('Access-Control-Allow-Origin', origin, false);
}}
来源:(免责声明:我写的代码)


当它存在时,它使用
Origin
,当它不存在时,它默认为
*

干得好,我渴望看到CSP的东西,因为我从来没有使用过它。我想,对于CSP阻塞,您不必附加观察者,也不必阻塞类似的东西。此请求包含一个源站标头,但响应标头包含访问控制允许源站:*但请查看此响应标头,因为访问控制允许凭据我认为它与cookie&访问控制允许凭据标头相关,因此我必须检查访问控制允许凭据标头是否存在于响应标头i中必须响应Access Control Allow Origin作为请求的源标题,但由于我对firefox扩展不太熟悉,我不知道如何做,我发现系统地使用“Origin”的值比检查“Access Control Allow Credentials”更简单。我在答案中添加了一些代码来演示。
https://2-edge-chat.facebook.com/pull?channel=p_1675691344&seq=0&partition=-2&clientid=368c9db5&cb=7b8p&idle=6&cap=8&msgs_recv=0&uid=1675691344&viewer_uid=1675691344&state=offline üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Origin', '*' ile eşleşmiyor.)
observerHandler : { observe : function(subject, topic, data) {

   // http interface
   var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
   if(httpChannel == null) {
      return;
   }


   // check origin header
   // was throwing an exception necessary if header is not set, mozilla ?
   var origin;
   try {
      origin = httpChannel.getRequestHeader('Origin');
   } catch(e) {}

   if(!origin) {
      origin = '*';
   }


   // check response header
   // was throwing an exception necessary if header is not set, mozilla ?
   var header;
   try {
      header = httpChannel.getResponseHeader('Access-Control-Allow-Origin');
   } catch(e) {}


   // abort if header has cors already
   if(header == '*' || header == 'null') {
      return;
   }


   // force cross origin
   httpChannel.setResponseHeader('Access-Control-Allow-Origin', origin, false);
}}