JS篇 同源策略、CORS、XSS、SessionCookie

http://www.cnblogs.com/diydyq/p/4078689.html

同源策略:
如何引用: (iFrame指的是iframe DOM节点)1. 引用iframe的window对象:iFrame.contentWindow2. 引用iframe的document对象:iFrame.contentDocument,或者:iFrame.contentWindow.document

示例:
两个页面,前者页面中嵌入iframe,src指向后者:1. test.nuomi.com/link1.vm2. nuomi.com/link2.vm;

同源要求:Protocols, domains, and ports均相同子域名不同的两个站:test.nuomi.com, nuomi.com,如果要通信,必须设置为统一的域名:document.domain=nuomi.com;即使其中一个已经是域名:nuomi.com,仍然需要明确调用:document.domain=nuomi.com;

document.domain设值:1. 只能是当前域名的suffix,否则报错:Uncaught SecurityError: Failed to set the 'domain' property on 'Document': 'test' is not a suffix of 'test.nuomi.com'.2. 设值为com也会报错:'com' is a top-level domain.3. 必须是"."点分隔的后缀,否则报错:'mi.com' is not a suffix of 'test.nuomi.com'

不同源时:

  1. 外面访问里面window的document属性:iFrame.contentDocumentChrome报错:  Uncaught SecurityError: ... Protocols, domains, and ports must match.Firefox报错:   nullIE9报错:      SCRIPT5: 拒绝访问
  2. 里面访问外面window的document属性:window.parent.documentChrome报错:  Uncaught SecurityError: ... Protocols, domains, and ports must match.Firefox报错:   Permission denied to access property 'document'IE9报错:    SCRIPT5: 拒绝访问

术语:

  1. CORS    **Cross-Origin-Resource-Sharing. (跨域资源共享) **
  2. ACAO    Access-Control-Allow-Origin

解决方案:

  1. 如果都属于同一个域名,但子域不同时,都设置document.domain;即可相互访问;
  2. JSONP通信
// jQuery JSONP
var def = $.ajax({
    url:    "http://nuomi.com/test/request/page/jsonp0.jsp",
    dataType:   "jsonp",
    //jsonp:  "cbNameFlag",
    jsonpCallback:  "cbNameTest"
}).done(function(data, textStatus, jqXHR ){
    console.log("Access done:", arguments, data.info);
}).fail(function( jqXHR, textStatus, errorThrown){
    console.log("Access fail:", arguments);
});
  1. Access-Control-Allow-Origin
      这种方案支持两种:
      1) 简单的请求:
      请求方法不支持Put,Delete
      此时Request header会包含:O****rigin: http://test.nuomi.com;
      期待Response header包含:A****ccess-Control-Allow-Origin: http://test.nuomi.com
      2) Preflight方式的请求:
      这种方式,代码中虽然请求一次,但是实际会请求两次:第一次发送OPTION方法,询问对方是否支持我方某种请求方式(如:GET,POST)?如果第一次进过允许,那么发送第二次请求;否则第二次不再发送;
      第一次请求:
        Request头包括:  OriginAccess-Control-Request-MethodAccess-Control-Request-Headers(optional),
        Response头包括: Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers
        如图所示:

      第二次请求:
        直接用代码中的方法发送(PUT、DELETE),然后得到结果;
      从"6. CORS tutorial"转载的流程如下:
  2. postMessage解决跨域问题,支持IE9及以上;
    复制代码

    /* 外面页面的script /function msgHandler(e){  console.log("Outer message:", e);}if(window.addEventListener){  window.addEventListener("message", msgHandler, false);}else{  window.attachEvent("message", msgHandler);}// 待加载后发送$("#iframe1").on("load", function(e){  console.info("Iframe onLoad:", e);  $("#iframe1")[0].contentWindow.postMessage("Data from outer, repects 'the structured clone algorithm. '", "");});
    复制代码

复制代码

1 /* 里面页面的script / 2 function msgHandler(e){ 3 console.log("Inner message:", e); 4 } 5 6 if(window.addEventListener){ 7 window.addEventListener("message", msgHandler, false); 8 }else{ 9 window.attachEvent("message", msgHandler);10 }11 window.parent.postMessage("Data from inner to outer.", "");
复制代码

CORS:
  全称是跨域资源共享(Corss Origin Resource Sharing), 于2014年1月已经成为CORS W3C标准。里面增加了预请求Preflight以支持更广范围的场景。
  常见的头信息包括:
  Request Headers:
  Origin、Access-Control-Request-Method、Access-Control-Request-Headers
  Response Headers:
  1. 允许向该服务器提交请求的URI
  Access-Control-Allow-Origin: <origin> | *
  2. 浏览器允许访问的服务器的头信息的白名单
  Access-Control-Expose-Headers: ..., ...
  3. 请求有效期(单位:秒):
  Access-Control-Max-Age: <seconds>
  4. 允许的请求方法:
  Access-Control-Allow-Methods
  5. 实际的请求中,可以使用的自定义HTTP请求头
  Access-Control-Allow-Headers
  6. 告知客户端,当请求XHR的withCredientials属性是true的时候,响应是否可以被得到。(从而使得下一次请求时,上一次的Cookies可以随着请求发送
  Access-Control-Allow-Credentials
  例子:  withCredential   without credential

参考资料:

  1. Same-origin policy      https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin
  2. document.domain      https://developer.mozilla.org/en-US/docs/Web/API/document.domain
  3. HTML <iframe> Element   https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe
  4. window.postMessage    https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage
  5. Allow CORS         https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
  6. CORS tutorial        http://www.html5rocks.com/en/tutorials/cors/

XSS:
  全称是跨站脚本攻击(Cross Site Scripting),通过在用户浏览某个存在XSS漏洞的站点时,执行特定的脚本或者第三方站点的脚本,从而可以用户sessionid等之类的安全信息。
  这类攻击常被分为两类:
  1. 非持久型xss攻击:  在URL中通过参数嵌入转义的script脚本来;
  2. 存储型XSS攻击:   通过表单提交等方式,在字段中嵌入脚本内容,并存入到后端数据库中;待其他用户浏览时影响更多的用户。
  预防方式:对字段内容进行转义,禁止:<script>之类的内容在前后HTTP中传输;

Session、Cookie:
  Session保存在服务器端,JAVA EE API写到:
  request.getSession(boolean) 参数为true时,如果不存在则新建一个Session;
  
session.getId() 可以获取到唯一标识;
  
session.isNew() 判断此时客户端是否用过|知道此session;如果客户端禁用Cookie则isNew()一直返回true;
  
session.invalidate() 失效session。
  个人理解:session在server端新建后,会通过response.addCookie()方法在cookie中添加sessionid,否则此后server端怎么识别该客户端呢?
  Cookie保存于浏览器,里面会保存session信息,如果浏览器禁用Cookie,可以在
URL
或者Form中添加session字段;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容