安全沙箱

来源:互联网 发布:java 线程池 队列 编辑:程序博客网 时间:2024/04/29 19:49

Flex安全沙箱包括:远程沙箱与本地沙箱。其实这个沙箱模型类似与浏览器中的同源策略。在同一域内的资源会被放到一个安全组下,这个安全组就被称为Flex安全沙箱了。

本地和远程:

1. 本地和远程文件:

本机上的swf文件和在本地网页中嵌入的本地swf是本地文件,服务器上的swf或者服务器页面嵌入的swf文件是远程文件。

2.本地和远程访问:

使用file协议(file:///C:/Documents%20and%20Settings/hr/%E6%A1%8C%E9%9D%A2/NaviContainers.swf)或者路径名访问(C:\Documents and Settings\hr\桌面\NaviContainers.swf)是本地访问,而通过http协议或者其他协议访问时网络访问。

在深入了解沙箱之前先得明确FlashPlayer的权限控制(我还是按照FlashCS3上的中文官方文档的名词来划分吧):

1、管理用户控制:
这指系统的最高权限用户,windows下的Administrator,linux下的root等。有两种类型的控制:
a)、mms.cfg文件:数据加载、隐私控制、FlashPlayer更新、旧版文件支持、本地文件安全性、全屏模式等。(一般安装Flash Player不会生成此文件,详细可以参照http://blog.csdn.net/xcl119xcl/article/details/5843796)
b)、"全局FlashPlayer信任"目录:当某些SWF文件被指定到这个受信任的目录下时,这些SWF文件会被分配到受信任的本地沙箱。它们可以与任何其它SWF文件进行交互,也可以从任意位置(远程或本地)加载数据。该信任目录的默认路径为:C:/windows/system32/Macromed/Flash/FlashPlayerTrust。(Flash Buidler就是通过这个文件,把debug这个文件目录加到flashbuilder.cfg,这个运行debug下面的程序时,不会出现沙箱问题)

2、用户控制:
相对于第1种,这里的用户是指普通用户。有这三种类型的控制:
a)、摄像头与麦克风设置:还记得ClickJacking的那个FlashDEMO么?
b)、共享对象存储设置:就是那个SharedObject了。
c)、相对与"全局FlashPlayer信任"目录,用户权限这也有个"用户FlashPlayer信任"目录。默认路径:C:/DocumentsandSettings/{username}/ApplicationData/Macromedia/FlashPlayer/#Security/FlashPlayerTrust。

3、Web站点控制(跨域策略文件):
就是家喻户晓的crossdomain.xml文件了,现在的安全策略是该文件只能存放在站点根目录下了,文件格式如:

<cross-domain-policy><allow-access-from domain="*"/><allow-http-request-headers-from domain="*" headers="*"/></cross-domain-policy>
通过该文件的配置可以提供允许的域跨域访问本域上内容的权限。

4、作者(开发人员)控制:
开发者可以通过编码(在AS脚本中)指定允许的安全控制权限,如:Security.allowDomain("www.xeye.us");当然都支持通配符*了。这个通配符真是个瘟神,程序员可得谨慎使用,以免添加不必要的安全风险。FlashPlayer的权限控制明了之后,现在可以来看看Flex安全沙箱了。

1、远程沙箱:
这个远程沙箱控制着远程域上,浏览器环境中的安全策略,比如http://xeye.us/域中的Flash文件就无法单刀直入地与http://hi.baidu.com/ycosxhack域上的Flash文件交互。同一个域(严格域)下的所有文件属于一个沙箱,沙箱内的对象是可以互相返回,而沙箱之间的对象需要交互的话,得靠上面介绍的权限控制的“Web站点控制(跨域策略文件)”与“作者(开发人员)控制”进行了。
2、本地沙箱:
再来看一下Flex安全沙箱中的本地沙箱,Flash与Flex文件可以在我们的桌面环境下运行。如果没有个很好的安全策略来限制这些功能不弱的AS脚本的话,那绝对是很危险的事。它有三种类型:
a)、只能与本地文件系统内容交互的本地沙箱:顾名思义,就是该Flash文件在本地运行时是不能与网络上的对象进行通信的,而只能与本地对象进行交互。
b)、只能与远程内容交互的本地沙箱:还是顾名思义,此时的Flash文件要与远程域对象交互时,需在远程域上通过策略文件或以Security.allowDomain编码方式来设置访问策略(同远程沙箱)。此时不能访问本地文件。
c)、受信任的本地沙箱:完美了,上面介绍的权限控制中,管理用户与普通用户都有FlashPlayer信任目录的控制权限,只要将我们的SWF文件放到受信任目录内运行,那么这个Flash文件就可以与本地域和远程域通信了:)。
当然以上这些沙箱类型,我们可以通过编码来确定当前运行的Flash文件被分配到什么类型的沙箱中。还是通过Security类:Security.sandboxType,值:
Security.REMOTE(远程沙箱)(例如把debug下的文件放到IIS或者Tomcat上,通过http来访问)
Security.LOCAL_WITH_FILE(只能与本地文件系统内容交互的本地沙箱)()
Security.LOCAL_WITH_NETWORK(只能与远程内容交互的本地沙箱)(除了TRUSTED,把debug下文件拷贝到本地桌面等没有信任的位置,或者通过\\192.168.0.50\TestRSL\NaviContainers.html)
Security.LOCAL_TRUSTED(受信任的本地沙箱)(在Flash Builder下调试debug下文件,原因上面有介绍)

在我们发布Flash时生成的HTML文件内,<object>与<embed>标签内的几个属性需要明确的。
◆allowNetworking:
该参数控制Flash文件的网络访问功能或者说是限制as脚本与网络通信。有三个值:all(所有的网络API都可用)、internal(除了不能使用浏览器导航和浏览器交互的API外,其它的都可用)、none(所以网络API都不可用)。
◆allowScriptAccess:
这是AS与JS通信的安全控制,还记得ExternalInterface的作用吗。有三个值:never(ExternalInterface的call方法不能与HTML的JS脚本进行通信)、sameDomain(同域内就可以了,这是默认值)、always(这个就允许所有域了,比较危险)。
◆allowFullScreen:
全屏模式的安全问题,这是一个boolean值,默认为false,不允许Flash全屏。只有flash控件接受了鼠标事件或键盘事件后才允许全屏,通过dispatchEvent发布事件是不被认可的。全屏带来的安全问题莫非是用户界面欺骗这样的类型?我不是很清楚。
上面这三个属性得区分好了啊。

安全问题不仅这点,还有比如LocalConnetion的本地通信、共享对象SharedObject的使用、E4X在AS中的使用、其它的Socket通信、一些网络API,比如全局的navigateToURL、Flash与其它非Flash的外部对象的通信问题等等。这些安全问题大都围绕安全沙箱进行。Flash或者Flex文件可以做得很漂亮,很精彩,比如那些非常优秀的Flash动画与游戏,然而一定得时刻保持警惕。

原创粉丝点击