flash安全策略的理解
一直以来对flash的安全策略是一头雾水,什么安全沙箱,跨域策略文件一堆东西乱七八糟,搞不清楚。不过纠结到现在已经基本上理解了。
flash的安全问题在官方手册上有足够的解释,这里我就不去去搬条文了,主要写些自己的理解。
其实完全不需要去死啃手册,我们只需要用常识就可以理解flash的安全策略。
所谓安全其实就是私人财产的保护问题,我们自己的财产不能随便被别人侵占或者利用。别人的财产也不能被我们自己随便的侵占和利用。
那么为了达到保护私人财产的目的,首先我们要把界限划出来,也就是说什么是你的财产,什么是我的财产,这个要讲清楚,否则其他都是白扯。
flash 的安全沙箱这一手段就是用来达到这个目的的。一个安全沙箱就划定了一份私人财产。安全沙箱之间的财产是不能随便(即无条件的)相互流通的。但安全沙箱之内的财产则可以(无条件,其实也不完全是无条件,一个例外是不同as版本的跨脚本访问问题,其他例外暂时不知道)相互访问。
当然上面说的只是概念,或者说只是一个虚无的法律,具体到实际则需要一个执法者,而这个执法者就是flashplayer(一定要与swf这个概念区分开)。而那些swf,图片,文本等资源,则是我们的财产。fp加载这些财产时根据这些财产的来源在逻辑上将他们划分到不同的安全域。
上面的文字已经将flash的安全策略问题解释了大概。接下来的问题是不同沙箱之间的财产可以流通的具体的条件,这个也是复杂的地方所在。
具体的条件依赖于两个方面:1、访问者与被访问者之间的关系;2、财产的具体类型。
为了解释第一个方面,我们建立一个模型。一个最简单但却能完全解释问题的模型如下:模型中有三个安全沙箱,其中一个是本地沙箱,另外两个是不同的网络沙箱。如图:
在这个模型中共有三种访问关系
1、本地访问远程
2、远程访问本地
3、远程互访
其中只有第二种访问是被完全禁止的,即远程沙箱中的资源无法访问本地。
而其他两种情况则要视具体情况而定,具体地:
首先要看加载的东西是内容还是数据(内容和数据这两个概念的解释官方文档上有),如果是内容则fp不需要被加载方授权,如果是数据则需要被加载方授权。
然后看加载方式否是本地,如果是本地则fp需要主动加载方进行授权,如果是远程之间加载则fp不需要主加载方授权。这是解释得通的。因为如果swf资源在本地,那么它可能拥有(如果我们把他发布成只访问本地的话)本地所有资源的访问权限,这等于是给不法分子开了一个入口,但不要紧,只要我们没有把这个swf设为信任的,那么他就逃不掉,也就是说资源有进口无出口。
当然我们也可以选择将swf加入本地的另一种安全域,即发布成只访问网络的,但这是堵住了他的入口,开放了他的出口。依然是安全的。
当然我们也可以手动的将swf加入信任让他进出口都开放,或者用应用程序来讲swf加入信任。具体的可以看官方文档上的说明。
最后如果资源都处于网络沙箱中,则fp不需要主加载方授权,因为相对于本地,网络沙箱中的资源都是他人的财产,没有必要去关心他人的事情。