chrome插件开发笔记-跨域(译)

chrome插件开发中,**XMLHttpRequest ** 对象的same origin policy(同源策略),在chrome插件中没有受到限制。

Extension origin

每一个插件都在自己单独的安全隔离源运行(separate security origin) 。如果没有设置其他权限的话,插件能够使用XMLHttpRequest获取安装包内的内容。现在举一个例子。假如一个插件包含一个名叫config.json的配置文件,该文件在config_resources文件夹下。我们可以使用下面的方式获取config.json的信息。

      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = handleStateChange;// Implemented elsewhere. 
      xhr.open("GET", chrome.extension.getURL('/config_resources/config.json'),true);
      xhr.send();

如果插件想使用一个安全源,而不是内容安装包内的文件,如 http://www.google.com, 浏览器不会允许扩展向该地址发送请求,除非该地址添加到允许的请求源中。

请求跨域允许(Requesting cross-origin permissions)

往manifest文件的permissions属性中添加对应的地址,插件就能向远程服务发送请求。

{ 
  "name": "My extension", 
  ... 
  "permissions":[ "http://www.google.com/" ]
  ...
} 

permissions的值的写法如有两种,一种是全值,一种是匹配模式的写法。
全值 : “http://www.baidu.com/
模式匹配:”http://*.baidu.com/

安全考虑(Security considerations)

通过XMLHttpRequest 来获取到对应的信息时,我们应该注意cross-site scripting
。一定要注意不要使用危险的API.就像下面的例子

  var xhr = new XMLHttpRequest();
  xhr.open("GET", "http://api.example.com/data.json", true);
  xhr.onreadystatechange = function(){ if (xhr.readyState == 4) { 
  //如果返回的数据是脚本话会运行脚本
   var resp = eval("(" + xhr.responseText + ")"); ... 
  }
}
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/data.json", true);
xhr.onreadystateChange = function() {
   if (xhr.readyState == 4) {
     // 可能会注入恶意的脚本 
    document.getElementById("reps").innerHtml = xhr.reponseText; 
  } ...
}
xhr.send();

我们应该使用安全的API(不会运行脚本)

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/data.json". true);
xhr.onreadystateChange = function() { 
if (xhr.readyState == 4) { 
var resp = JSON.parse(xhr.responseText);
 }
}
xhr.send();
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/dat.json", true);
xhr.onreadystatechange = function() { 
if (xhr.readyState == 4) {
 // innerText does not let the attacker inject HTML elements.    
documemt.getElementById("resp").innerText = xhr.responseText; }
}
xhr.send();

此外一定要注意通过HTTP协议接收到的数据,如果我们的插件处于一个恶意的网络中,网络攻击者可以篡改HTTP响应,(这种攻击叫中间人攻击)。为了防止此类攻击,我们更应该使用HTTPS协议代替HTTP

翻译来源 Cross-Origin XMLHttpRequest

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • http://www.91ri.org/tag/fuzz-bug 通常情况下,有三种方法被广泛用来防御CSRF攻击...
    jdyzm阅读 4,200评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,860评论 25 708
  • 每个人有一段日子里都会有那么一两碗泡面吧。 她第一次来我家的时候,被我简单的冰箱惊着了,里面就几份小菜,水果是很少...
    味博士阅读 561评论 3 6
  • 我总觉得自己永远达不到别人的高度,拥有不了别人的成功,也觉得自己不会遇到适合自己的人。当欣赏别人的时候,我会感到自...
    落花知思绪阅读 334评论 0 0