Flash player 9 跨域访问Webservice安全问题

如果想要在Flash里面获取数据,就必须在对方server上配置crossdomain.xml。具体来说,比如你的Flash在domain A下面,而你想要访问domain B暴露的web service,那么domain B的server根目录下必须要有一个crossdomain.xml文件来配置说你有这个权限。这个是Flash Player的安全限制。

 

注意: Tomcat , 默认情况下是指,ROOT目录下。

 

对于Flash Player 9之前的版本,这个crossdomain.xml文件大概如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM
	"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd" >
<cross-domain-policy>
	<allow-access-from domain="*" secure="true" />
</cross-domain-policy>

 以上配置允许所有domain访问当前server所暴露的数据(比如web service)。你可以在domain属性里面指定特殊的规则。secure属性用来设置你所暴露的数据是否走https协议。

 

但是对于Flash Player 9而言,crossdomain.xml文件内容出现了较大的变化,原因是Flash Player 9的security机制有所改变。所以当我用Flex 3调用cross domain的web service时,还使用上面的crossdomain.xml文件,结果就报错说security error。于是稍微研究了一下,得到如下解决方案,其实就是要改变crossdomain.xml的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cross-domain-policy SYSTEM
	"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd" >
<cross-domain-policy>
	<site-control permitted-cross-domain-policies="all" />
	<allow-access-from domain="*" />
	<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

 以上是Flash Player 9所要求的crossdomain.xml的内容。可以看到多了两个tag。其中site-control是可选的,但是allow-http-request-headers-from对于cross domain的web service确实必须的。如果没有允许header,就会像我之前一样报错。这些配置项的具体含义以及其他可选配置项,可以参考http://www.adobe.com/devnet/flashplayer/articles/flash_player_9_security.pdf

 

 

 

/

 

Flex访问 Flash访问解决方法

关于Flex或Flash访问解决方案,事情的起因是,由我公开的一个webservices开始的,一个朋友在webservice的基础上制作了一个weather查询的,在本机测试ok,一拿到网上,就会出现error(是访问的错误)

后来,终于找到了Flash访问的问题解决方案,如下:

写一个名字为 crossdomain.xml 的XML文件,这个方法是允许任何Flash都可以调用,放到被调用文件的网站根目录下:

复制内容到剪贴板
代码:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

只让你允许的网站来调用你的数据~.

复制内容到剪贴板
代码:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="www.ad0.cn" />
<allow-access-from domain="ad0.cn" />
<allow-access-from domain="*.netfetch.cn" />
</cross-domain-policy>

如果使用XMLSocket要把端口号加上

复制内容到剪贴板
代码:
<cross-domain-policy>
<allow-access-from domain="*.ad0.cn" to-ports="507,516" />
<allow-access-from domain="*.netfetch.cn" to-ports="516-523" />
<allow-access-from domain="www.ad0.cn" to-ports="507,516-523" />
<allow-access-from domain="202.103.96.68" to-ports="*" />
</cross-domain-policy>

如果安全策略文件放在根目录,文件名字必须为crossdomain.xml,如果不放在根目录,要用System.security.loadPolicyFile(http://www.netfetch.cn/crossdomain.xml )这样的方法加载安全策略文件

 

/

 

一、概述

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

二、crossdomain.xml文件格式

crossdomain.xml的格式非常简单,其根节点为<cross-domain-policy> ,其下包含一个或多个<allow-access-from>节点,<allow-access-from>有一个属性 domain,其值为允许访问的域,可以是确切的 IP 地址、一个确切的域或一个通配符域(任何域)。下边是两个例子:


 程序代码

<?xml version=”1.0″?>
<cross-domain-policy>
<allow-access-from domain=”www.friendOfFoo.com” />
<allow-access-from domain=”*.foo.com” />
<allow-access-from domain=”105.216.0.40″ />
</cross-domain-policy>


 程序代码

<?xml version=”1.0″?>
<cross-domain-policy>
<allow-access-from domain=”*” />
</cross-domain-policy>

第二个例子允许任何域的访问。对于crossdomain.xml文件存放位置,建议将其存放于站点根目录中!

三、示例

1.SWF文件主要ActionScript:


 程序代码

on (release) {
var myvar = new LoadVars();
myvar.t = t2.text;
myvar.sendAndLoad(”http://www.163.com/test.asp“,myvar,”post”);
myvar.onLoad = function(re){
if(re){
t1.text = myvar.t;
}else{
t1.text = “fail…”;
}
}
}
2.test.asp代码:


 程序代码

<%
Dim t
t = Request.form(”t”)
Response.write(”t=” & t & ” back!”)
%>

文章来自: 闪客居(www.flashas.net) 详文参考:http://203.208.37.104/search?q=cache:iQ9cHSsDfvwJ:www.flashas.net/html/flashas/flashheWEBchengxuyingyong/20080310/2632.html+crossdomain.xml+%E4%BD%8D%E7%BD%AE&hl=zh-CN&ct=clnk&cd=1&gl=cn&st_usg=ALhdy2_GYTnZpz3jo5A_lm2iLdhQBecaLg

 

 

///

 

http://www.crossdomainxml.org/

 

为还存在疑惑“怎么不起作用呀”的网友补充几句话。
首先,crossdomain.xml是放在服务器端的文件,什么叫做放在服务器端,就是放在你要获取的文件的所在的那台机器的那个域名下面。比如我自己的网站是xxx.me.com,我的网站上有一个swf要获取xxx.you.com上的文件,那么crossdomain.xml要放在xxx.you.com上才可以。crossdomain.xml里面的内容就是

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*.me.com" />
</cross-domain-policy>

 

 

/

 

1.在4月份的安全更新之前,crossdomain是可以放于任何位置的,只要在代码中指定Security.loadPolicyFile即可,当然,默认的会首先去找站点根目录下(对于tomcat来说就是root了)。
不过在安全更新之后,flash的安全策略发生了一些变化。
其 中一点就是,将策略文件控制类型由原来的ALL改为了MASTER,MASTER策略文件称为主策略文件,在4月份以前,基本上没人注意这个主策略文件, 和我们常用的策略文件有什么区别。主策略文件是置放在站点根目录下,对整个站点访问权限进行约束的策略文件。这个改变使得默认的必须在站点根目录下置放 crossdomain文件,即使你在自己的站点中需要crossdomain,也必须获得主策略文件的许可。
如果这种限制,就要求一定有对服务器控制的能力,至少你要能在根目录放置文件。但是有些时候,没有这样的权限,因此,官方还提供了另一种做法,在后台代码级别允许提供策略文件来取代master策略。
以.net为例
String policyFile = "....(省略)"
Response.AppendHeader("Content-Type", "text/xml; charset=UTF-8");
Response.AppendHeader("X-Permitted-Cross-Domain-Policies", "all");
Response.Write(policyFile);
这种代码级别的做法就是,在loadPolicy时,reposonse中的header里加上("X-Permitted-Cross-Domain-Policies", "all");然后再返回policyFile。

而另一点变化是策略文件的声明形式发生了变化,导致现在网上搜到的很多crossdomain的写法可能在项目里不起作用。

2.能报错的FlashPlayer是调试版的,非调试版的FlashPlayer不会报错。而且IE和FF要分开装的。即使是相同的IE,也可能出现运行的不是同一版本的FlashPlayer。

3.localconnection、shareobject能共享任何类型的数据,但是要记住,他们并不是同一个实例的引用,只是拥有相同值的相同类型的对象。

 

 

//

 

关键字: flex crossdomain

在jboss4.2中设置 crossdomain.xml应该放在[jboss home]/server/default/deploy/jboss-web.deployer/Root.war下,内容为

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy 
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-access-from domain="*" />
</cross-domain-policy>


这个目录是jboss的根目录,可以通过以下的url访问 crossdomain.xml

http://domainname:8080/ crossdomain.xml

如果 crossdomain.xml不是放在根目录下,而是在某个webapp下面,在flex中就需要在初始化的时候用

Security.loadPolicyFile("http://domainname:8080/dir/crossdomain.xml");
SilverRing 2008-09-10   回复
若使用 tomcat,则放在 [tomcat home]/webapps/ROOT 下面。
//
The answer depends on how you access your Alfresco server from the internet. If you're exposing the whole Tomcat server, then create the crossdomain.xml in the Tomcat ROOT webapp. If you're fronting Tomcat with Apache, for example, then you'll need to place the file in Apache's equivalent folder.
/
如果你不用X-Permitted-Cross-Domain-Policies的header返回这种方式,就只能在站点的根目录下放crossdomain文件。
站点根目录,不是指你的应用的根目录,而是整个域名的根目录。
比如你的站点是 http://www.yoursite.com/yourapp/ 那么,站点根目录是指 http://www.yoursite.com/,因此你需要能够直接在 http://www.yoursite.com/crossdomain.xml这个路径下访问到主策略文件,否则那就不是主策略文件。

英语好的话自己去看,我已经告诉你怎么做了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值