• 【转载】Flash安全沙箱和跨域文件


    1.1 简述flash的安全沙箱

    1.Flash有四种基本的沙箱类型:

    Remote: swf来自网络,遵守域的沙箱规则,不能读取不同域中的资源,除非有设置。

    Local with file swf是本地文件,可以读取本地数据,但不能与网络通信。

    Local with networkswf是本地文件,可以与网络通信,但不可以读取本地数据。

    Local trusted swf是本地文件,可以读取本地数据,也可以与网络通信,此为最高权限,受本地信任。(一般开发阶段,swf默认设置为此权限)

    2.2条基本原则:

    位于同一沙箱中的资源始终可以互相访问。

    远程沙箱中的swf始终不能访问本地文件和数据。


    1.2 flash跨域策略文件crossdomain.xml配置详解 

    一、概述

     解决flash安全沙箱带来的跨域问题的方法之一是部署策略文件(crossdomain.xml,该文件限制了flash是否可以跨域读写数据以及允许从什么地方跨域读写数据。

     过程:

    位于A域中的SWF文件要访问B域的文件时,SWF首先会检查A域服务器目录下是否有crossdomain.xml文件,如果没有,则访问不成功;若crossdomain.xml文件存在,且里边设置了允许A域访问,那么通信正常。所以要使Flash可以跨域传输数据,其关键就是crossdomain.xml。

     一个通用的跨域文件内容如下:

    <?xml version="1.0"?>

    <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

    <cross-domain-policy>         

        <allow-access-from domain="*" />   

    </cross-domain-policy>

    二、crossdomain.xml的配置 

    1.crossdomain.xml的放置位置 

    A.主策略文件放置位置

         如有跨域访问需求,必须在目标域的根目录下放置crossdomain.xml文件例如:tomcat下的root文件夹中,且该根目录下的配置文件称为“主策略文件”。若不存在主策略文件,则该域将禁止任何第三方域的flash跨域请求。

    主策略文件对全站的跨域访问起控制作用。


    主策略文件举例:

    新浪微博的跨域文件

    http://weibo.com/crossdomain.xml 

    <cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
    <allow-access-from domain="js.wcdn.cn"/>
    <allow-access-from domain="js.t.sinajs.cn"/>
    <site-control permitted-cross-domain-policies="all"/>
    <allow-http-request-headers-from domain="js.wcdn.cn" headers="*"/>
    <allow-http-request-headers-from domain="js.t.sinajs.cn" headers="*"/>
    </cross-domain-policy>

    百度贴吧的跨域文件:

    http://tieba.baidu.com/crossdomain.xml 

    <cross-domain-policy>
    <allow-access-from domain="tieba.baidu.com"/>
    <allow-access-from domain="static.tieba.baidu.com"/>
    <allow-access-from domain="mv.baidu.com"/>
    <allow-access-from domain="tb2.bdstatic.com"/>
    <allow-access-from domain="tb1.bdstatic.com"/>
    </cross-domain-policy>

    优酷的跨域文件

    http://www.youku.com/crossdomain.xml 

    <cross-domain-policy>
    <allow-access-from domain="*"/>
    </cross-domain-policy>


    B.子策略文件放置的位置

        也可以单独在某路径下放置仅对该路径及其子路径生效的crossdomain.xml配置文件,这需要在flash的AS脚本中使用如下语句来加载该配置文件:[具体的加载权限限制,将受后文中site-control策略的影响]

     Security.loadPolicyFile("http://www.xxx.com/subdir/crossdomain.xml")

     

    2.crossdomain.xml的配置方法及影响 

        crossdomain.xml需严格遵守XML语法,有且仅有一个根节点cross-domain-policy,且不包含任何属性。在此根节点下只能包含如下的子节点:

    site-control

    allow-access-from

    allow-access-from-identity

    allow-http-request-headers-from


    1>site-control:通过检查该节点的属性值,确认是否可以允许加载其他策略文件。[如果该策略文件并非主策略文件,则此节点被自动忽略] 

    每个site-control标签有且仅有属性permitted-cross-domain-policies,该属性指定相对于非主策略文件的其他策略文件的加载策略。permitted-cross-domain-policies属性值有如下情况:

    none: 不允许使用loadPolicyFile方法加载任何策略文件,包括此主策略文件。

    master-only: 只允许使用主策略文件[默认值]

    by-content-type:只允许使用loadPolicyFile方法加载HTTP/HTTPS协议下Content-Type 为text/x-cross-domain-policy的文件作为跨域策略文件。

    by-ftp-filename:只允许使用loadPolicyFile方法加载FTP协议下文件名为       crossdomain.xml的文件作为跨域策略文件。

    all: 可使用loadPolicyFile方法加载目标域上的任何文件作为跨域策略文件,甚至是一 个JPG也可被加载为策略文件![使用此选项那就等着被xx吧!] 

    如需要对网站某子目录做单独的flash跨域限制策略,在主策略文件中必须进行相应的site-control设置。 

    下面的例子将site-control策略配置为可加载本服务器中其它的text/x-cross-domain-policy文件作为跨域策略文件。

     <cross-domain-policy> 

         <site-control permitted-cross-domain-policies="by-content-type" /> 

    </cross-domain-policy>

     

    2>allow-access-from:通过检查该节点的属性值,确认能够读取本域内容的flash文件来源域。 

    allow-access-from标签有三个属性:

    domain:该属性指定一个确切的 IP 地址、一个确切的域或一个通配符域(任何域)。只有domain中指定的域,才有权限通过flash读取本域中的内容。 

    可采用下列两种方式之一来表示通配符域:

    1)单个星号(*),如:<allow-access-fromdomain="*" />,表示匹配所有域和所有 IP 地     址,此时任何域均可跨域访问本域上的内容。[这是极不安全的!]

    2)后接后缀的星号,表示只匹配那些以指定后缀结尾的域,如*.qq.com可匹配            game.qq.com、qq.com。形如www.q*.com或www.qq.*的为无效配置。

    Tips:当domain被指定为IP地址时,只接受使用该IP作为网址来访问的来源请求[此时ip地址也就相当于一个域名而已],如domain被设置为192.168.1.100时,使用http://192.168.1.100/flash.swf 来请求该域内容是允许的,但是使用指向192.168.1.100的域名www.a.com来访问时[http://www.a.com/flash.swf]将会被拒绝,因为flash不懂得dns解析 

    to-ports:该属性值表明允许访问读取本域内容的socket连接端口范围。可使用to-ports="1100,1120-1125"这样的形式来限定端口范围,也可使用通配符(*)表示允许所有端口。 

    secure:该属性值指明信息是否经加密传输。当crossdomain.xml文件使用https加载时,secure默认设为true。此时将不允许flash传输非https加密内容。若手工设置为false则允许flash传输非https加密内容。(adobe官方建议不使用false) 

    下面的例子配置为允许所有qq.com下的所有二级域名[包括qq.com本身]通过https访问本域中的内容。

    <cross-domain-policy> 

         <allow-access-from domain="*.qq.com" secure="true" /> 

    </cross-domain-policy>


    3>allow-access-from-identity:该节点配置跨域访问策略为允许有特定证书的来源跨域访问本域上的资源。每个allow-access-from-identity节点最多只能包含一个signatory子节点。

    <allow-access-from-identity>

       <signatory>

         <certificate

           fingerprint="01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef:01:23:45:67"

           fingerprint-algorithm="sha-1"/>

       </signatory>

    </allow-access-from-identity>


    4>allow-http-request-headers-from:此节点授权第三方域flash向本域发送用户定义的http头。

        allow-access-from节点授权第三域提取本域中的数据,而 allow-http-request-headers-from 节点授权第三方域将数据以http头的形式发送到本域中。[简而言之,allow-access-from是控制读取权限,allow-http-request-headers-from是控制以http头形式的写入权限]

    allow-http-request-headers-from包含三个属性:

    domain:作用及参数格式与allow-access-from节点中的domain类似。

    headers:以逗号隔开的列表,表明允许发送的http头。可用通配符(*)表示全部    http头。

    secure:作用及用法与allow-access-from节点中的secure相同。

     

    在下面的示例中,任何域都可以向当前域发送 SOAPAction 标头:

     <cross-domain-policy> 

         <allow-http-request-headers-from domain="*" headers="SOAPAction" /> 

    </cross-domain-policy>

     

    三、总结

     

    不正确的crossdomain.xml策略将导致严重的安全问题,如信息泄露、CSRF等。从上文中可以看出,在进行安全评估时,我们应重点关注以下几点: 

    1)allow-access-from标签的domain属性检测:domain属性应根据最小化原则按需设置,仅允许可信任的来源跨域请求本域内容。禁止将该属性值设置为“*”。

    2)allow-http-request-headers-from标签的domain属性检测:domain属性应根据最小化原则按需设置,仅允许可信任的来源向本域跨域发送内容。禁止将该属性值设置为“*”。

    3) site-control标签的permitted-cross-domain-policies属性检测:根据业务的实际需求及可行性,对该属性做相应设置。禁止将该属性值设置为“all”。


    本文在http://www.2cto.com/Article/201108/100008.html的基础上进行了一定修改。

  • 相关阅读:
    SpringBoot集成Mybatis
    springboot通过slf4j配置日志
    SpringBoot导入jsp依赖始终报错
    shiro小记
    阿里开发手册华山版——(编程规约篇)记录目前自己不合理的地方
    [网络流24题] 2. 太空飞行计划问题 解题报告
    LOJ 6089 小 Y 的背包计数问题 解题报告 (动态规划)
    UVA 10599 Blocks 解题报告 (动态规划)
    Comet OJ#12E Ternary String Counting 解题报告
    [WC2016]挑战NPC 解题报告
  • 原文地址:https://www.cnblogs.com/sumsung753/p/3821505.html
Copyright © 2020-2023  润新知