在网页游戏开发中,绝大多数即时通信游戏采用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. CSS小知识---回到顶部

    所需js文件 <script type="text/javascript" src="js/jquery-1.11.3.js"></scrip ...

  2. rest_framework解析器组件源码流程

    rest_framework解析器组件源码流程 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数 ...

  3. 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?

    import random import string def GenKey(length): chars = string.ascii_letters + string.digits return ...

  4. 2018-2019-2 20165114《网络对抗技术》Exp4 恶意代码分析

    Exp4 恶意代码分析 目录 一.实验目标 (1)监控你自己系统的运行状态,看有没有可疑的程序在运行. (2)分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sys ...

  5. 利用MacBookPro入侵无线网络

    目前无线网络的加密方式主要有WEP,WPA/WPA2.这是最常看到的加密方式,最近由于需要,专门去研究了一下如何入侵无线网络. 1.入侵WEP加密的无线网络 WEP加密方式现在已经很不安全了,因为只要 ...

  6. COS-5资源分配与调度

    操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...

  7. 搭建maven项目步骤

    整体项目结构如下: 第一步 第二步 第三步:删除src目录,只留pom文件 第四步: 第五步: 6 7 8 9 10 11 12

  8. jQuery的序列化元素 serialize()方法 serializeArray()方法 param()方法

    当提交的表单元素较多时用serialize()方法,serialize()方法也是作用于一个jQuery的对象,它能够将DOM元素内容序列化为字符串,用于Ajax请求. serialize() 方法通 ...

  9. PHP 开发环境搭建

    1. PHP (1) download PHP and extra the zip file to the folder “C:\tools\php” (2) add the path “;C:\to ...

  10. Sudoku Solver, 求数独

    问题描述:填充数独表中空元素.空元素为'.' 算法分析:没填充一个数,都要看这个数所在的行,列,小矩阵是否合法.然后还要看整个数独表是否正确,而判断整个数独表只能通过递归,因为前一个结果的判断要依赖后 ...