在网页游戏开发中,绝大多数即时通信游戏采用flash+socket 模式来作为消息数据传递。在开发过程中大多数开发者在开发过程中本地没有问题,但是一旦部署到了网络,就存在连接上socket服务器。究其原因主要是没有部署安全策略文件。在这里我主要说说flash策略文件部署。

1.flash安全策略文件格式

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

  1.1 domain 请求服务来源地 可以是ip,也可以是域名 也可以是域名通配  eg: 192.168.1.110, www.***.com, *.foo.com

  1.2 to_ports 容许程序访问的端口 “*”代表可以访问的端口。当然为了安全起见个人建议填写能访问的端口。

2.策略文件的主要作用

   2.1 让跨域机器能访问当前服务器的资源。

   2.2 保护本机网络资源不被其余flash调用。

3.策略文件的部署方式

  3.1 部署一个http服务器在当前的服务器并在网站的根目录下放crossdomain.xml文件

  3.2 开一个843端口的socket服务器,专门处理用于发送crossdomian.xml 内容,发送完毕立即关闭socket 断开tcp

4. 游戏开发中处理

  4.1 一般在静态资源处理控制授权的时候,部署得有http服务器 这个时候一般采用在可访问的资源目录下存放crossdomain.xml

  4.2 在仅仅只有部署socket服务的时候一般采用843 端口处理策略文件。

  4.3 当游戏服务器中既有http服务 也有socket 服务的时候 也可以直接部署http 放crossdomain.xml。个人建议还是采用开843端口socket处理。flash启动的时候时候会默认先尝试连接843端口接收数据,然后在访问http根目录数据。导致socket连接缓慢给用户体验不是很好。

5.用erlang实现一个切实可用的socket 843服务器,整个实现过程我在 ranch实现游戏服务器 的基础上稍加改动即实现了。

  5.1 去掉 game_socket_app.erl 中     ok = game_socket_store:init(), 即可。

-module(game_socket_app).

-behaviour(application).

%% Application callbacks
-export([start/, stop/]). -define(PORT,).
-define(LISTEMNUM,). %% ===================================================================
%% Application callbacks
%% =================================================================== start(_StartType, _StartArgs) ->
Port = case application:get_env(game_socket, port) of
{ok, P} -> P;
undefined -> ?PORT
end,
ListenNum = case application:get_env(game_socket,listemnum) of
{ok,L}->L;
undefined->?LISTEMNUM
end,
case game_socket_sup:start_link([Port,ListenNum]) of
{ok, Pid} ->
{ok, Pid};
Other ->
{error, Other}
end. stop(_State) ->
ok.

  5.2 在 game_socket_server.erl 接收到客户端发送数据后发送策略文件,本文没有对客户端发送的数据做匹配。如果需要请自行处理。

  

-module(game_socket_server).
-behaviour(gen_server).
-behaviour(ranch_protocol). %% API.
-export([start_link/]). %% gen_server.
-export([init/, handle_call/, handle_cast/, handle_info/,
terminate/, code_change/]). -define(TIMEOUT, ). -define(SERVER, ?MODULE). -define(GENERIC_POLICY_FILE,
<<"<?xml version=\"1.0\"?>"
"<!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\">"
"<cross-domain-policy>"
" <allow-access-from domain=\"*\" to-ports=\"*\" />"
"</cross-domain-policy>">>). -record(state, {ref,socket, transport,otp,ip,port,timeref}).
%% API. start_link(Ref, Socket, Transport, Opts) ->
gen_server:start_link(?MODULE, [Ref, Socket, Transport, Opts], []). %% gen_server. %% This function is never called. We only define it so that
%% we can use the -behaviour(gen_server) attribute. init([Ref, Socket, Transport,Opts]) ->
%%防攻击使用 多个连接建立后不给消息 造成端口占用
{ok,TimeRef} = timer:send_after(?TIMEOUT,self(),disconnect),
{ok,{Address,Port}} = inet:peername(Socket),
{ok, {state, Ref, Socket, Transport,Opts,Address,Port,TimeRef}, }.
%% timout function set opt parms
handle_info(timeout, State=#state{ref=Ref, socket=Socket, transport=Transport}) ->
ok = ranch:accept_ack(Ref),
ok = Transport:setopts(Socket, [{active, once}]),
{noreply, State};
%% 主动断开连接
handle_info(disconnect,State=#state{timeref = TimeRef})->
timer:cancel(TimeRef),
{stop,normal,State};
%% handle socket data
handle_info({tcp, Socket, _Data}, State=#state{socket=Socket, transport=Transport}) ->
Transport:send(Socket,?GENERIC_POLICY_FILE),
{stop, normal, State};
handle_info(_Info, State) ->
{stop, normal, State}. handle_call(_Request, _From, State) ->
{reply, ok, State}. handle_cast(_Request, State) ->
{noreply, State}. terminate(_Reason, _State) ->
ok. code_change(_OldVsn, State, _Extra) ->
{ok, State}.

到这里一个可以用于实际生产环境的socket 843服务器就完成了。怎么样?简单吧!

  

flash游戏服务器安全策略的更多相关文章

  1. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  2. 游戏服务器菜鸟之C#初探四游戏服务

    经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...

  3. Redis在游戏服务器中的应用

    排行榜游戏服务器中涉及到很多排行信息,比如玩家等级排名.金钱排名.战斗力排名等.一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自己维护一个元素数量有限的top集合.但是有时 ...

  4. c++游戏服务器编程学习笔记(一)TCP/IP

    1. c++游戏服务器编程c++运行效率非常高2. TCP传输控制协议IP网际协议Socket 3.Linux 乌班图开源第三方库BOOST 4.80%游戏服务器端用C++工作量最大的地方是具体的游戏 ...

  5. 游戏服务器ID生成器组件

    游戏服务器程序中,经常需要生成全局的唯一ID号,这个功能很常用,本文将介绍一种通用ID生成组件.游戏服务器程序中使用此组件的场景有: 创建角色时,为其分配唯一ID 创建物品时,每个物品需要唯一ID 创 ...

  6. 游戏服务器生成全局唯一ID的几种方法

    在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使 ...

  7. Centos环境下部署游戏服务器-常用命令

         图1     在Linux的世界,如果你不玩命令,那你见了同行都不好意思和人家打招呼.同时服务器正常状况下放在远端,一般都是开ssh登录服务器,相信远程桌面的人很少见吧.这篇文章说说Linu ...

  8. Centos环境下部署游戏服务器-编译

    游戏服务器是在windows环境开发的,相关跨平台的东西在这里不谈了,只谈如何将Visual Studio 工程转换到Linux下编译.这里涉及到的软件分别为:Centos版本为6.4,Visual ...

  9. Centos环境下部署游戏服务器-软件安装

    这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...

随机推荐

  1. 安装三大浏览器驱动driver

    1.chromedriver 下载地址:https://code.google.com/p/chromedriver/downloads/list 2.Firefox的驱动geckodriver 下载 ...

  2. html 基础 表单

    一.表单 <form id="" name="" method="post/get" action="负责处理的服务端&qu ...

  3. linux centos7 安装zookeeper

    linux 系统下 zookeeper 安装教程 1.下载安装包 1)进入安装目录 cd /home/install/ 2)下载 wget http://mirror.bit.edu.cn/apach ...

  4. 20145201《Java程序设计》课程总结

    每周读书笔记链接汇总 第一周读书笔记:http://www.cnblogs.com/20145201lzx/p/5249064.html 第二周读书笔记:http://www.cnblogs.com/ ...

  5. MLP(多层神经网络)介绍

    写在前面的 接触神经网络(ANN)的时间很长了,以前也只是学了学原理,做过一个BPN的练习,没有系统的总结过,最近看Torch的源码,对MLP有了更多的了解,写写自己学到的东西吧,算是做了一次总结! ...

  6. java判断集合list是为空

    if(null == list || list.size() ==0 ){ } list.isEmpty()和list.size()==0 没有区别 isEmpty()判断有没有元素而size()返回 ...

  7. 配置zabbix_server通过zabbix_proxy进行监控Host

    zabbix_server添加proxy并监控主机 zabbix分布式监控系统安装配置:http://www.cnblogs.com/LuckWJL/p/9037007.html 安装配置zabbix ...

  8. [翻译]用PostCSS改善你的CSS代码质量

    “代码质量”这个术语对于程序员来说并不陌生.毕竟,每个开发人员都知道,代码只是能工作是不够的.它还应该具备其他要素:它应该是可读的,良好的格式和一致性.它也应该符合一些标准的量化指标.不过这些在写CS ...

  9. 谈谈对Canal(增量数据订阅与消费)的理解

    概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql(也支持mariaDB). 起源:早期,阿里巴巴B2B公司 ...

  10. Mysql 语句单表查询

    一基本查询 -- 创建商品表 CREATE TABLE products( pid INT PRIMARY KEY AUTO_INCREMENT, pname VARCHAR(20), price D ...