好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

flash跨域策略文件crossdomain.xml配置详解 - 网站安全

CnCxzSec衰仔's Blog

0x00  目录

 

0x01  简介

0x02 crossdomain.xml 的配置

0x03  总结

 

0x01  简介

 

flash 在跨域时唯一的限制策略就是 crossdomain.xml 文件,该文件限制了 flash 是否可以跨域读写数据以及允许从什么地方跨域读写数据。

 

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

 

本文将着重介绍 crossdomain.xml 文件的配置方法及不同配置对 flash 跨域的影响。

 

0x02 crossdomain.xml 的配置

 

2.1 crossdomain.xml 的放置位置

自 flash 10 以后,如有跨域访问需求,必须在目标域的根目录下放置 crossdomain.xml 文件,且该根目录下的配置文件称为[ 主策略文件 ]。若不存在主策略文件,则该域将禁止任何第三方域的 flash 跨域请求。

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

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

 

 

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

 

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

crossdomain.xml 需严格遵守 XML 语法, 有且仅有一个根节点 cross-domain-policy ,且不包含任何属性。 在此根节点下只能包含如下的子节点: site-control 、 allow-access-from 、 allow-access-from-identity 、 allow-http-request-headers-from 。下面将分别介绍这四个子节点:

 

2.2.1site-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.2.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 加密内容。

 

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

 

 

<cross-domain-policy> 

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

</cross-domain-policy>

 

2.2.3allow-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>

 

2.2.4allow-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>

 

0x03  总结

 

不正确的 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 ]。

 

#!如果大家有好的想法或者建议,欢迎与我讨论。

查看更多关于flash跨域策略文件crossdomain.xml配置详解 - 网站安全的详细内容...

  阅读:36次