(转)flash的Socket通讯沙箱和安全策略问题
一、沙箱和安全策略问题
1、此问题发生在连接时,准确地说是连接前,分别两种情况:
1.本地播放
本地播放时,默认情况下Flash Player将不允许swf访问任何网络。
访问http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html,将swf加入到许可列表,即可解除限制。
2.WEB发布
发布在WEB上的swf, 将可能面临跨域的问题。 2、Flash中的通信方式有两种:
1.HTTP方式:如URLLoader等用于加载远程swf、文件、图像、音视频流。
2.Socket主要:如 XMLSocket,用于与远程服务端建立长效连接。
Flash Player6以上版本引入了安全策略文件,在进行正式的通信前,会检查目标位置是否存在合法的安全策略,以防止不同域内的应用无限制任意互访。
HTTP方式下,Flash Player会检查目标域根目录下是否存在crossdomain.xml,如果有,则获取并分析其内容(内容后述)以确定是否允许继续访问。
Socket方式下,Flash Player获取安全策略稍微复杂些,从9.0.115.0版起,标准步骤如下(以下描述以IE为标准,例外情况后述):
1)首先向目标主机 843 端口发起连接,并发送一个字符串,内容为"<policy-file-request/>",并等待返回安全策略文件并分析。
2)若1)失败,则检查AS代码中是否使用了Security.loadPolicyFile("xmlsocket://主机:端口")方法加载安全策略文件,若有,则获取并分析。
3)若2)失败,则向AS代码中即将连接的 "目标主机:端口" 发起请求,过程同1)。
4)若成功获得安全策略文件并经分析认为允许建立连接,则继续执行Connect()方法,此时方真正尝试创建与目标主机的连接。 3、解决方案
HTTP 连接方式不用再说,只说说 Socket 方式。
1) 在服务端写一个程序,监听843端口,当收到 "<policy-file-request/>" 时将恰当的策略内容(crossdomain.xml)发送回客户端。
2) 在AS中通过loadPolicyFile()加载策略文件,此处需注意使用xmlsocket://,而不是 http://。
3) 在标准服务端口中,检测到"<policy-file-request/>"时,返回策略内容。 4、例外情况及测试结果
经测试发现,在IE,Opera中,Flash Player会严格按上述步骤检查安全策略。
在 FireFox, Chrome中发起连接时,Flash Player并不会向服务端发送"<policy-file-request/>",而是直接连接成功。这应该是Flash Player不同实现版本的原因。 5、数据传输中的问题
在XMLSocket数据传输中,需要注意以下细节,否则会出来些莫名其妙的问题。
1.结束符号
XMLSocket接收到服务端下发的数据时,将连续放于接收缓冲区,直到接收到"\0"字节(字节内容为ASCII值0),才认为接收完成,并调用相应的onData或onXML事件。
服务端若用Java编写,并使用标准的String类族,则在发送数据结尾应手动加上"\0"。
若用 C++ 编写,由于C++中标准字符串类型便是以字节0作结束标记,故不必再加"\0"。
* C++中需注意另一个问题,若自行进行了字符串处理,在决定字符串长度时,标准的strlen及String.Length()等返回的均是实际有效字符个数,最终向网络发送时,总长度应加1字节,以容纳结尾的字节0。
* 此问题在发送安全策略内容时同样存在,故需重视。 2.中文问题
默认情况下,不管从哪一端发向另一端的数据,若包含了中文字符,都会产生乱码的现象,解决方法有二:
1).在AS中加入"System.useCodepage=true;" 强制使用本地代码集,此法最方便,但是在跨语种平台上仍会出现乱码。
2).在代码中自行编写转码函数,此法复杂些,但通用性强。具体转码算法网上很多,主要是C++服务端需要,Java中使用JDK类转换为UTF-8即可。
(转)flash的Socket通讯沙箱和安全策略问题的更多相关文章
- 利用BlazeDS的AMF3数据封装与Flash 进行Socket通讯
前几天看到了Adobe有个开源项目BlazeDS,里面提供了Java封装AMF3格式的方法.这个项目貌似主要是利用Flex来Remoting的,不过我们可以利用他来与Flash中的Socket通讯. ...
- [转]浅谈Flash Socket通信安全沙箱
用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无 ...
- 可遇不可求的Question之flash的socket连接安全策略文件篇
flash的socket连接安全策略文件 最近公司做压力测试的时候,发现了一个问题.flash的socket客户端向服务端请求安全策略文件的时候,服务端负责回发策略文件的端口能连接上,但是没有响应 ...
- Silverlight下的Socket通讯
http://www.cnblogs.com/chengxingliang/archive/2012/05/24/2515100.html 在Silverlight中进行通讯,只能使用4502-453 ...
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 试解析Tomcat运行原理(一)--- socket通讯
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- c# TCP Socket通讯基础
在做网络通讯方面的程序时,必不可少的是Socket通讯. 那么我们需要有一套既定的,简易的通讯流程. 如下: <pre name="code" class="csh ...
- Android笔记:Socket通讯常见问题
经验证的socket通讯问题 1.如果是模拟器和本机PC直接通讯,需要使用本机IP地址 而不是 10.0.2.2 如本机的静态地址为192.168.1.2 则直接使用该地址 2.接收和连接代码不能在 ...
- flash as3 socket安全服务网关(socket policy file server)
关键字: SecurityErrorEvent socket as3 flash有着自己的一套安全处理模式,在socket方面,我这样的菜鸟无法理解他的好处:一句话,不怀好意的人如果想用flash写一 ...
随机推荐
- EasyUI DataGrid定制默认属性名称
EasyUI DataGrid绑定服务器返回Json数据的解决方案 1. 服务器返回的数据对象格式,及初始化返回值 public class RequestResult { private int c ...
- 对数组元素进行排序的方法总结(利用C++)
首先,对数组元素进行排序方法总结为以下两类: 一.简单排序算法(时间复杂度O(n*n)) 1.插入排序 2.选择排序 3.交换排序,即冒泡排序 二.先进排序算法(时间复杂度O(n*logn)) 1.快 ...
- 解决ios上微信无法捕获返回键按钮事件的问题
1 //匿名函数 $(function(){ getHistory(); var flag=false; setTimeout(function(){ flag=true },1000) window ...
- 一个非常给力的播放器video-js
video-js采用的是html5播放器. 在不支持html5的浏览器会自动切换成flash. video-js的官网http://www.videojs.com/ 看看下载的demo就知道个大概了. ...
- RMAN增量备份-备份保留策略-设置备份集属性
RMAN增量备份:增量备份级别:0,1,2,3,4BACKUP DATABASE也是创建数据库的完整备份,但是这种备份不同于增量备份的0级备份.这种备份不包含增量备份的0级备份,并不支持在此基础上再创 ...
- HDU 5791 Two
题意:给两个序列,求公共序列的个数 分析:很自然想到最长公共子序列的转移的转移形式,用dp[i][j]表示第一个串前i个 和第二个串前j个匹配的答案数量,a[i]==b[i],dp[i][j]=dp[ ...
- 动态加载Ribbon功能区
上下文选项卡对新UI的功能提供了极大的推进作用.当用户对某对象执行特定的任务时就会出现特定的选项卡.例如,在Excel中处理图表时,一个上下文选项卡提供用于图表处理的额外选项.本文将介绍创建和执行这些 ...
- c++如何生成随机数
一.使用rand()函数 头文件<stdlib.h> (1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_ ...
- sql server数据库区分大小写设置
数据库表中字段alter Table TableName 区分大小写 ALTER Column ColumnName VARCHAR(50) COLLATE Chinese_PRC_CS_AS不区分大 ...
- iOS框架介绍
iOS框架介绍 Cocoa Touch GameKit 实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息 iOS设备之间蓝牙数据传输 从iOS7开始过期 局域网游 ...