由于最近用到Flex发现存在安全沙箱问题,无法访问外部接口,就转载下来,留着以后查看详细学习。由于转载的文章也是转载的,且未写出处,故此处未写明转载出处。
安全沙箱
?
术语:
资源发布者?(Resource?Distributor?):
提供一个给定资源的一方。通常是一个服务器操作者?,诸如一个网站管理员或套接字服务器管理员?。

?
资源创建者?(Resource?Creator?):
真正创建资源的一方。对于.swf文件,资源创建者是编译.swf的ActionScript开发人员?。

?
用户?(User):
Flash Player运行的计算机的用户。
?
安全沙箱类型:
可通过?flash.system.Security.sandboxType?获取其值
- remote:来自远程范围的所有.swf
- local-with-filesystem
- local-with-networking
- local-trusted
安全沙箱类型可能禁止的外部操作类型:
- 本地内容
- 内容作为数据访问
- 交叉脚本控制
- 装载数据
- 连接一个套接字
- 发送数据到一个外部的URL
- 访问用户的相机和麦克风
- 访问本地共享的对象
- 上传或下载由用户选择的文件
- 通过一个.swf文件脚本控制一个HTML页面,反之亦然
- 连接一个LocalConnection频道
限制范围:
内容装载?:可以使用?Loader?、Sound?和?NetStream?等这样一些类来加载内容?

?
内容作为数据访问?:(读取一个内容资源的内部信息,例如,读取一张位图的像素?或者一段音频?)可以通过使用?Bitmap?对象、BitmapData.draw()?方法、Sound.id3?属性或者?SoundMixer.computeSpectrum()?方 法从加载的媒体内容中提取数据?

?
交叉脚本控制?:?

?
数据装载?:可以从使用?URLStream?、URLLoader?、Socket?和?XMLSocket?等类加载的外部文件?(如?XML?文件)中直 接访问数据?

?
限定策略:
?
创建者允许?:一个.swf文件含有对恰当的Security?类的静态方法allowDomain?()的调用。
所有者允许?:意味着发布者使得恰当的跨域名政策文件可用?。
?
remote?安全沙箱

?
local-with-filesystem?安全沙箱

?
local-with-networking?安全沙箱

?
local-trusted?安全沙箱

?
套接字安全:
本地沙箱?:

?
远程沙箱?:

?
全沙箱(二):权限控制 & 如何选择设置一个本地(local)安全沙箱类型关键字: flash player,sand box
权限控制:?

1. 管理员控制:?计算机的管理用户(使用管理权限登录的用户?)可以应用能影响计算机所有用户的 Flash Player 安全设置
-
mms.cfg?文件:C:WINDOWSsystem32MacromedFlashmms.cfg
- “?全局 Flash Player 信任?” 目录:C:WINDOWSsystem32MacromedFlashFlashPlayerTrust
2. 用户控制?:
-
设置 UI?:右键Flash Player
-
设置管理器?:右键Flash Player -> 高级
- “?用户 Flash Player 信任?” 目录:在 Windows XP 上:C:Documents and SettingsJohnDApplication DataMacromediaFlash Player#SecurityFlashPlayerTrust,在 Windows Vista 上: C:UsersJohnDAppDataRoamingMacromediaFlash Player#SecurityFlashPlayerTrust
3. 网站控制:?(策略文件)详见 安全沙箱(三)
?
4. 作者(开发人员)控制:?Security.allowDomain("www.example.com"),详见 安全沙箱(三)
?
三种设置 local-with-filesystem 或 local-with-networking 的方法:
?
使用Flex Builder和Flash authoring tool所编译的swf均是local-trusted?,配置文件目录见下:
”C:Documents and Settings[USER]Application DataMacromediaFlash Player#SecurityFlashPlayerTrust?“
?
1. 使用Flex Builder:默认-use-network=false(如果文件不在非信任位置)
在Additional编译器参量下,输入:-use-network=false
-use-network=false:local-with-filesystem
-use-network=true:local-with-networking

?
2. 使用Flash authoring tool:默认Access local files only(如果文件不在非信任位置)
Access local files only:local-with-filesystem
Access network only:local-with-networkin

?
3. 使用Flex SDK 命令行编译器
- mxmlc.exe?-use-network=false?-file-specs?c:...Calendar.as?-output?c:...Calendar.swf??
?
授予本地信任:
?
1. 打开在线?的?Flash Player Settings Manager
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html
?
2. 在 Global Security Settings 中添加你希望信任的位置
?
3.?关闭所有的?Flash Player?实例?,重新启动?(非常重要,所有的?)
?
=================================
发布者许可(政策文件):
?
创建政策文件:
<?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="domainOrIP"?/>??
- allow-access-from?domain="*.example.com"?allow-access-from?domain="*"?allow-access-from?domain="localhost"?</>??
- "*"符号表示给所有源头?授权。
- 为了包含本地范围?作为一个授权源头,一个政策文件必须通过为domain属性指定 * 来显式地信任所有的源头。
- domain指定的IP?和他们等价域名?是不同的?。
公布政策文件:
-
默认的?名字和位置:名字:crossdomain.xml?;位置:网站的根目录
- 如果政策文件在网站根目录?中,它授权对整个网站的访问权?。
- 如果政策文件在网站的一个子目录?中,它授权对该目录及子目录的访问权?,此时需要手工装载这个政策文件?:
Java代码?

Security.loadPolicyFile("http://domainOrIP/pathToPolicyFile");??
?
取得一个政策文件的许可来装载数据?:
allow-access-from?domain="www.site-b.com"?allow-access-from?domain="site-b.com"?>??
var?urlloader:URLLoader?=?new?URLLoader(); ??
urlloader.load(new?URLRequest("http://site-a.com/assets/file.xml"));??
?
取得一个政策文件的许可来把内容作为数据访问?:
var?loaderContext?=?new?LoaderContext(); ??
loaderContext.checkPolicyFile?=?true; ??
??
theLoader.load(new?URLRequest("http://site-a.com/assets/image.jpg",?loaderContext)); ??
trace(theLoader.content);??
?
使用一个政策文件来授权套接字连接?:
allow-access-from?domain="www.site-b.com"?to-ports="3000"?allow-access-from?domain="site-b.com"?to-ports="3000"? var?socket:Socket?=?new?Socket(); ??
try?{ ??
????socket.connect("site-a.com",?3000); ??
}?catch?(e:SecurityError)?{ ??
????trace("Connection?problem"); ??
????trace(e.message); ??
}??
?
1. 端口范围?:
to-ports="9100,9200"
to-ports="10000-11000"
to-ports="*"
?
2. 如果一个政策文件时取自小于1024?端口的一个套接字,* 表示对任何端口的访问都被授权
如果一个政策文件取自大于或者等于1024?端口的一个套接字,* 表示对于任何大于或者等于1024端口的访问都被授权
?
3. 当一个政策文件在和所需的套接字连接的不同端口?提供服务时,必须手工装载那个政策文件?,添加以下语句:
Security.loadPolicyFile("xmlsocket://domainOrIP:portNumber");??
?
基于HTTP的政策文件:
必须满足的条件:
- 它必须被命名为crossdomain.xml
- 它必须放置于网页服务器的根目录?中
- 它必须在所需要的套接字连接的域名?或IP地址的端口80?上提供服务
- 在AS3中,它必须通过Security.loadPolicyFile()来手工装载
?
创建者许可(allowDomian()):
?
Security.allowDomain("www.sometvnetwork.com",?"sometvnetwork.com"); ??
Security.allowDomain("*");??
- 只作用于交叉脚本控制?和HTML-to-SWF脚本控制?操作
-
*?符号不能?用作一个子域名?的通配符?:Security.allowDomain("*.example.com?");不行的
- 一个.swf文件可以通过检查被装载的.swf文件的LoaderInfo?对象中的childAllowsParent?变量来判定它是否被授权
导入装载:swf装载swf
?
如果两个swf来自不同的远程区域?,或者不同的安全沙箱类型,使用下面的方法加载
var?loaderContext:URLLoader?=? ??
loaderContext.applicationDomain?=?ApplicationDomain.currentDomain; ??
loaderContext.securityDomain?=?SecurityDomain.currentDomain; ??
loader.load(new?URLRequest("http://site-a.com/assets/file.swf"),?loaderContext);??
?
处理安全违规:
?
要么抛出一个SecurityError?异常,要么调度一个SecurityErrorEvent?.SECURITY?_ERROR
urlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,?securityErrorListener); ??
urlloader.load(".../index.xml");??
?
有时需要注册LoaderInfo?的事件监听:
var?loader:Loader?=?new?Loader(); ??
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,?securityErrorListener);?
=======================
?
安全沙箱(四):Others
关键字: flash player,sand box
限制网络 API:
适用端口阻止?的 ActionScript 3.0 API:
FileReference.download()、FileReference.upload()、Loader.load()、Loader.loadBytes()、navigateToURL()、 NetConnection.call()、NetConnection.connect()、NetStream.play()、Security.loadPolicyFile()、sendToURL()、Sound.load()、URLLoader.load()、URLStream.load()
?
使用?allowNetworking?参数:
您可以通过在包含 SWF 内容的?HTML 页?中的?<object>?和?<embed>?标签中设置 allowNetworking 参数来控制 SWF 文件访问网络的功能。
allowNetworking 参数主要在 SWF 文件及所在的 HTML 页来自不同的域时使用。
- "all?" (默认值) — 在 SWF 中允许所有的网络 API。
- "internal?"— SWF 文件可能不调用浏览器导航或浏览器交互 API ,但是它会调用任何其它网络API。
- "none?"— SWF 文件可能不调用浏览器导航或浏览器交互 API ,并且它无法使用任何 SWF 到SWF 通信 API 。
Xml代码?

object?classic="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"??
- Code?base="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,124,0"??
- width="600"?height="400"?ID="test"?align="middle">??
- param?name="allowNetworking"?value="none"?/>??
- param?name="movie"?value="test.swf"?param?name="bgcolor"?value="#333333"?embed?src="test.swf"?allowNetworking="none"?bgcolor="#333333"??
- width="600"?height="400"??
- name="test"?align="middle"?type="application/x-shockwave-flash"??
- pluginspage="http://www.macromedia.com/go/getflashplayer"?object>??
?
或者修改Flex Builder?生成的HTML,加入以下参数:
Java代码?
AC_FL_RunContent(?...?"allowNetworking",?"none",?...)??
?
全屏模式安全性:
要启用全屏模式,请在包含 SWF 文件引用的 HTML 页的 <object> 和 <embed> 标签中添加?allowFullScreen?参数,并将参数值设置为 "true" (默认值为 "false"),如下例所示:
object?classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"??
codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,18,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> width="600"?height="400"?id="test"?align="middle"param?name="allowFullScreen"?value="true"?embed?src="test.swf"?allowFullScreen="true"?bgcolor="#333333"??
>??
?
或者修改 AC_FL_RunContent(?...?"allowFullScreen",?"true",0)">设置LocalConnection权限:
同一域中没问题?。
对于不同沙箱?的SWF文件,需要设置:
LocalConnection.allowDomain()??
?
控制外出 URL 访问:
- flash.system.fscommand() 函数
- ExternalInterface.call() 方法
- flash.net.navigateToURL() 函数
HTML 代码中用于加载 SWF 文件的?AllowScriptAccess?参数控制能否从 SWF 文件内执行外出 URL 访问?。
如果不设置?AllowScriptAccess 的值,则仅当 SWF 文件与 HTML 页来自同一个域?时才能通信?。
AllowScriptAccess 参数可以有 "always?"、"sameDomain?" 和 "never?" 这三个可能值中的一个:
- 当 AllowScriptAccess 为 "always" 时, SWF 文件可以与其嵌入到的 HTML 页进行通信,即使该 SWF 文件来自不同于HTML 页的域也可以。
- 当 AllowScriptAccess 为 "sameDomain" 时,仅当 SWF 文件与其嵌入到的 HTML 页来自相同的域时,该 SWF 文件才能与该 HTML 页进行通信。此值是 AllowScriptAccess 的默认值。
- 当 AllowScriptAccess 为 "never" 时,SWF 文件将无法与任何 HTML 页进行通信。
object?id='MyMovie.swf'?classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'??
codebase='http://download.adobe.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0'?height='100%'??
width='100%'param?name='AllowScriptAccess'?value='always'param?name='src'?value=''MyMovie.swf'embed?name='MyMovie.swf'?pluginspage='http://www.adobe.com/go/getflashplayer'?src='MyMovie.swf'??
height='100%'?width='100%'?AllowScriptAccess='never'>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|