快速业务通道

flash安全策略解决方案

作者 佚名技术 来源 服务器技术 浏览 发布时间 2012-07-08

  很多人在处理安全策略时遇到问题,我自己也总结了一些经验,供大家参考吧.在 Flash Player 9.0.124.0 及以后的版本中,socket策略文件对于任何 Socket 连接都是必需的。也就是说,无论连接到哪一个端口(即使连接到提供 SWF 文件的同一主机上的端口),目标主机上都需要套接字策略文件。连接步骤:

0.不论是低于还是高于1024端口,基于文件系统时都不会请求策略文件,基于网络时才会请求.
1.首先发出以null结尾的<policy-file-request/>的消息,检查服务器843端口是否有安全策略文件,策略文件格式为:
<cross-domain-policy>
<allow-Access-from domain="*" to-ports="80-9000" />
</cross-domain-policy>
发回策略文件的时候必要以0结尾,如果843端口在3秒内没有请求到策略文件或者to-ports配置的端口不允许链接,则断掉链接抛securityError,这个是flash主动发起的.
2. 如果您的客户端socket或XMLsocket连接中设置了Security.loadPolicyFile("xmlsocket://服务地址:应用端口"),则连接您的应用目标端口请求安全策略文件,请求和响应的方式如上,不设置是不会请求的.发请求是在调用connect之前.
3.如果您是http请求方式要设置Security.loadPolicyFile("http://服务地址/crossdomain.xml"),crossdomain.xml文件内容如上,放在网站根目录就行了.例如mop的http://www.mop.com/crossdomain.xml

解决方案1:使用adobe官方提供的文件直接在服务器的843端口上建立服务,这样响应速度最快,但对于应用的部署就麻烦了http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.HTML

解决方案2:客户端必须加Security.loadPolicyFile("xmlsocket://服务地址:应用端口"),在服务端的应用端口上的私有协议上处理,一般的协议是长度+类型+数据,这样判断长度是0x3C70类型0x6C69,单独处理这个消息,但对自己的私有协议处理还是有影响。
为什么是这样的长度和类型看图: flash安全策略解决方案 解决方案3:单独在服务应用上处理843端口,和其他应用的服务剥离出来:
  1. //安全策略服务
  2. publicvoidstartPolicyServer()throwsIOException{
  3. IoAcceptoracceptor=newNioSocketAcceptor();
  4. acceptor.setHandler(newPolicyServerHandler());
  5. acceptor.bind(newInetSocketAddress(843));
  6. System.out.println("安全策略服务侦听端口:843");
  7. }
  8. //其他应用服务
  9. ..................
  10. ..................
  11. //单独的安全策略处理器
  12. publicclassPolicyServerHandlerextendsIoHandlerAdapter{
  13. //22字节+0占1个字节
  14. Stringsecurity_quest="<POLICY-FILE-REQUEST/>";
  15. //最后以0结尾
  16. StringpolicyStr="<CROSS-DOMAIN-POLICY>\r\n<ALLOW-ACCESS-FROMto-ports=''\"80-9000\"''domain=''\"*\"''/>\r\n</CROSS-DOMAIN-POLICY>\r\n\0";
  17. privatefinalLoggerlog=Logger.getLogger(PolicyServerHandler.class.getName());
  18. publicvoidmessageReceived(IoSessionsession,Objectmessage)
  19. throwsException{
  20. IoBufferprocessBuf=(IoBuffer)session.getAttribute("processBuf");
  21. processBuf.put((IoBuffer)message);
  22. processBuf.flip();
  23. if(getRequest(processBuf)){
  24. byte[]reps=policyStr.getBytes("UTF-8");
  25. IoBufferrb=IoBuffer.allocate(reps.length);
  26. rb.put(reps);//也有putStrin

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号