flash的socket连接安全策略文件
连接到套接字
默认情况下,Flash Player 会从端口 843 查找套接字策略文件。和 URL 策略文件一样,此文件称为“主策略文件”。
在 Flash Player 6 中首次引入策略文件时,并不支持套接字策略文件。与套接字服务器的连接由默认位置中的一个策略文件授权,该默认位置是套接字服务器所在主机的 HTTP 服务器的端口 80。Flash Player 9 仍支持此功能,但 Flash Player 10 不再支持。在 Flash Player 10 中,只有套接字策略文件可授权套接字连接。
与 URL 策略文件类似,套接字策略文件支持元策略语句(用于指定可提供策略文件的端口)。但是,套接字策略文件的默认元策略不是“master-only”而是“all”。即,除非主策略文件指定更具限制性的设置,否则 Flash Player 假定主机上的任意套接字均可提供套接字策略文件。
默认情况下禁止访问套接字和 XML 套接字连接,即使所要连接的套接字与 SWF 文件位于同一个域中也是如此。可以从下列任意位置提供套接字策略文件,从而允许套接字级别访问:
■端口 843(主策略文件的位置)
■与主套接字连接相同的端口
■主套接字连接端口之外的端口
默认情况下,Flash Player 在端口 843 和主套接字连接所在的端口上查找套接字策略文件。如果要从其它端口提供套接字策略文件,SWF 文件必须调用 Security.loadPolicyFile()。
套接字策略文件具有与 URL 策略文件相同的语法,只是前者还必须指定要对哪些端口授予访问权限。如果套接字策略文件来自低于 1024 的端口号,则它可以对任何端口授予访问权限;如果策略文件来自 1024 或更高的端口,则它只能对 1024 端口和更高的端口授予访问权限。允许的端口在 <allow-access-from> 标记中的 to-ports 属性中指定。单个端口号、端口范围和通配符都是允许值。
下面是套接字策略文件的示例:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.mysite.com -->
<cross-domain-policy>
<allow-access-from domain="*" to-ports="507" />
<allow-access-from domain="*.example.com" to-ports="507,516" />
<allow-access-from domain="*.example.org" to-ports="516-523" />
<allow-access-from domain="adobe.com" to-ports="507,516-523" />
<allow-access-from domain="192.0.34.166" to-ports="*" />
</cross-domain-policy> 要从端口 843 或主套接字连接所在的端口上检索套接字策略文件,请调用 Socket.connect() 或 XMLSocket.connect() 方法。Flash Player 首先在端口 843 上检查是否有主策略文件。如果找到主策略文件,Flash Player 将检查该文件是否含有在目标端口上禁止套接字策略文件的元策略语句。如果未禁止访问,Flash Player 首先在主策略文件中查找适当的 allow-access-from 语句。如果找不到主策略文件,Flash Player 将从主套接字连接所在的端口上查找套接字策略文件。
要从其它位置检索套接字策略文件,请首先调用 Security.loadPolicyFile() 方法,调用时使用特殊的"xmlsocket"语法,如下所示:
Security.loadPolicyFile("xmlsocket://server.com:2525"); 先调用 Security.loadPolicyFile() 方法,然后再调用 Socket.connect() 或 XMLSocket.connect() 方法。Flash Player 随后将一直等待完成策略文件请求,之后再决定是否允许主连接。但是,如果主策略文件指定目标位置不能提供策略文件,则调用 loadPolicyFile() 无效,即使该位置有策略文件。
如果要实现套接字服务器,并且需要提供套接字策略文件,则应决定是使用接受主连接的同一端口提供策略文件,还是使用不同的端口来提供策略文件。无论是哪种情况,服务器都必须等到客户端的第一次传输收到之后才能发送响应。
当 Flash Player 请求策略文件时,它始终会在建立连接后传输以下字符串:
<policy-file-request/>服务器收到此字符串后,即会传输该策略文件。来自 Flash Player 的请求始终由 null 字节终止,来自服务器的响应也必须由 null 字节终止。
程序对于策略文件请求和主连接并不会使用同一连接,因此请在传输策略文件后关闭连接。如果不关闭连接,Flash Player 将关闭策略文件连接,之后重新连接以建立主连接。
flashpolicyd 安装方法:
下载地址:http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
当前的版本是:flashpolicyd_v0.6 ,其中里面readme中介绍的测试方法,虽然测试成功,但是实际跟flash player 有差别,
所以最后使用 http://code.google.com/p/flashpolicyd/中下载 flashpolicyd-2.1 解压后,使用里面的 check_flashpolicyd.rb
来测试最准确:./check_flashpolicyd --host 192.168.0.xx 843
注意: Adobe Flash Player version 10.0.42.34 在 socket 连接之前会首先启动一个socket 连接下载 策略文件,并在3秒后断开这个socket.
flashpolicyd_v0.解压后 提供 四个安装方法:
1。Perl_xinetd 和Perl_xinetd 测试认证不成功
因为每次都是在socket断开后才发送策略文件,
log日志:
Jan 5 21:06:57 [xinetd] START: flashpolicy pid=22840 from=192.168.157.138
Jan 5 21:06:57 [python2.6] begin read...
Jan 5 21:06:57 [python2.6] begin return policy...
Jan 5 21:06:57 [python2.6] begin readline...
Jan 5 21:07:00 [python2.6] 'list' object has no attribute 'strip'
Jan 5 21:07:00 [xinetd] EXIT: flashpolicy status=1 pid=22840 duration=3(sec)
可以看到xinetd和python之间 有延时3秒。
2。Standalone 安装简单,测试也成功
./flashpolicyd.pl --file=../policyfile.xml --port=843 >/dev/null &
./flashpolicyd.py --file=../policyfile.xml --port=843 >/dev/null &
3。Python_init 安装:
centOs:直接运行install.sh 就可以完成安装
gentoo: 必须自己在/etc/init.d/ 下自己写一个启动脚本 ,之后可以执行 rc-update add flash default ,让系统启动时,自动启动服务。(start-stop-daemon --help 可以查看详细参数)
以Python_xinetd 详细安装方法:(虽然可以安装,但是实际在flash player 测试不能认证成功)
必须使用python2.5或以上:
(如果python是2.5以下的,请升级python,升级参考:http://blog.techippo.org/archives/438
升级python 导致yum 不能使用,修复方法:
方法一: 简单修改下面2个文件:
nano -w /usr/bin/yum
nano -w /usr/sbin/yum-updatesd
在第一行:
#!/usr/bin/python 更改为:#!/usr/bin/python2.4 (原先的版本)
方法二:参考:http://www.phpvim.net/journal/centos-repair-yum-service.html (因为时间问题,没有经过自己验证)
centOS安装:
1.执行:install.sh
2.在/etc/services 配置使用的端口
flashpolicy 843/tcp
flashpolicy 843/udp
3.重新启动xinetd 服务:
service xinetd restart
之后查看 netstat -an |grep 843 服务器是否启动成功。
测试: python -c 'print "<policy-file-request/>%c" % 0' | nc 127.0.0.1 843
如果返回xml文件,表示成功安装flashpolicyd 服务
centOS 一般会启动iptables服务,843端口会禁止外部访问:
解决方法:
方法1:最简单的方法是停止iptables服务。
方法2:编辑 nano -w /etc/sysconfig/iptables 文件 (开放 843端口)
增加:
-A RH-Firewall-1-INPUT -p udp -m udp --dport 843 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 843 -j ACCEPT
重新启动iptables : /etc/init.d/iptables restart
注:如何是支持rpm 安装的linux 发行版本也可以参考 :http://code.google.com/p/flashpolicyd/ 进行rpm 安装
gentoo 安装:
1.安装 xinetd 服务:emerge -pv xinetd
使 xinetd 服务开机自动启动: rc-updata add xinetd default
2.mkdir /usr/local/etc/
(install.sh 把策略文件放着这个目录下:也可以自行更改策略文件的位置,安装后在 /etc/xinetd.d/flashpolicyd 这个文件更改位置)
3.执行:install.sh
注意:install.sh 最后一行:/etc/rc.d/init.d/xinetd reload 在gentoo是不成功的,可以不管它。
4.在/etc/services 配置使用的端口
flashpolicy 843/tcp
flashpolicy 843/udp
5.修改xinetd访问的权限,gentoo 默认启动的服务端口只有localhost 可以访问;
nano -w /etc/xinetd.conf
# only_from = localhost (这个注掉就好)
6.重新启动xinetd 服务:
/etc/init.d/xinetd restart
之后查看 netstat -an |grep 843 服务器是否启动成功。
测试: python -c 'print "<policy-file-request/>%c" % 0' | nc 127.0.0.1 843
如果返回xml文件,表示成功安装flashpolicyd 服务 ( nc 这个命令 gentoo默认是没有安装的,需要安装:emerge -pv netcat)
其他:
1.测试 flashpolicy 服务器是否运行良好,也可以在其它机器telnet xxx.xxx.xxx.xxx 843 看看端口是否正常,
不少系统由于1024以下的端口,都在iptables 的防护下,禁止外部连接,需要配置iptables开放843端口。
2.使用metalog单独记录日志(如果不配置,日志在/var/log/everything/current 中记录也会记录):
nano -w /etc/metalog.conf
增加:
Xinetd :
program_regex = "^xinetd"
program_regex = "^python"
logdir = "/var/log/xinetd"
break = 1
3.如果 flashpolicy 的访问量非常大,可以修改配置文件(/etc/xinetd.d/flashpolicyd或/etc/xinetd.conf)
增加:
instances = 25 (可以启动的实例的最大的值)
参考:
Linux xinetd使用指南:http://www.abc188.com/info/html/wangzhanyunying/jianzhanjingyan/20080417/69597.html
Python升级指南:http://blog.techippo.org/archives/438
flashpolicyd 下载地址:http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
ActionScript 3.0安全沙箱文档: http://help.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7c60.html
flashpolicyd rpm 安装(有牛人使用ruby编写的服务):http://code.google.com/p/flashpolicyd/
Iptables 指南 :http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html