ESFramework 通信框架安全机制的设计与实现

      在分布式通信系统中,安全无疑是非常重要的。ESFramework通信框架提供了哪些安全保障了?由于ESFramework通信框架是应用层的开发框架,那么本文我们只讨论ESFramework通信框架在应用层涉及到的安全问题。如果黑客是在网络层或链路层进行攻击,位于应用层的系统是无能为力的。从应用层来说,安全的重要性主要体现在以下几个方面:
(1) 防止恶意用户使用格式不正确的消息来试探服务端。
(2) 防止通信的消息被恶意用户截获,或者,即使被恶意用户截获,也无法破解其内容。
(3) 防止恶意用户在未成功登录前,就向服务器发送格式正确的伪装消息。
(4) 防止恶意用户使用巨大数量的空连接来消耗服务器的资源。

      ESFramework通信框架内置了一些安全机制,以对上述的安全性提供一些保障,下面我们一一说明。

1.消息格式验证

      ESFramework通信框架定义了通信消息的总体格式(即消息必须由消息头Header和消息体Body构成),而为了支持快速开发,ESPlus则定义了消息的详细格式(如StreamMessageHeader、TextMessageHeader等)。

      当网络引擎(无论是服务端的还是客户端的)从网络上接收到一批二进制数据时,会尝试去解析它。如果解析时发现,这批二进制数据的格式不是我们预定义好的消息的格式时,将会认为其是非法消息。此时,网络引擎将会丢弃非法数据,并关闭对应的连接(如果引擎是基于TCP协议的),然后再触发INetEngine接口的InvalidMessageReceived事件。

  /// <summary>/// 当接收到不完整或无法解析的数据时触发该事件/// </summary>  event CbGeneric<UserAddress, MessageInvalidType> InvalidMessageReceived;

复制代码

      事件的参数UserAddress说明了非法消息来源于哪个用户地址;而MessageInvalidType参数则说明了非法消息的类型:

    /// <summary>/// 接收到的无效的消息分类。/// </summary>    public enum MessageInvalidType    {/// <summary>/// 正常消息。/// </summary>        Valid = 0, /// <summary>/// 消息尺寸溢出。/// </summary>        MessageSizeOverflow,/// <summary>/// 无效的消息头/// </summary>        InvalidHeader,/// <summary>/// 无效的标识符/// </summary>        InvalidToken,/// <summary>/// 数据包长度不够/// </summary>        DataLacked,/// <summary>/// 无效的客户端类型/// </summary>        InvalidClientType    }

复制代码

       从该枚举可以看出,网络引擎收到的数据无法解析的愿意有几种:消息尺寸超过规定的大小,消息头无效、消息的标识符无效等。

2.消息加密

       对于一些关键的信息,是绝对不允许以明文的形式在网络上进行传送的。所以,消息在发送之前,必须进行加密。

      如果直接基于ESFramework通信框架开发(不使用ESPlus),那么,熟悉ESFramework通信框架骨架流程的朋友都知道IMessageTransformer接口,我们可以将其实现类的实例挂接在骨架流程的对应位置,以对进出的消息进行变形处理。所以,我们可以在IMessageTransformer的实现类中,完成对消息的加密和解密动作,比如,像这样:

    public class MessageEncryptor : IMessageTransformer    {public IMessage CaptureBeforeSendMessage(IMessage msg)        {//加密消息            return Encrypt(msg);        }

public IMessage CaptureReceivedMessage(IMessage msg)        {//解密消息            return Decrypt(msg);        }    }

复制代码

      如果使用的是ESPlus提供的Rapid引擎,由于Rapid内部在组装骨架流程时,是没有使用加密组件的,所以不能使用IMessageTransformer接口。但是,我们仍然可以在发送自定义信息时,保证信息的安全。我们是使用ICustomizeOutter发送自定义信息的,以Send方法为例:

  /// <summary>/// 向服务器发送信息。/// </summary>/// <param name="informationType">自定义信息类型</param>/// <param name="info">信息</param>  void Send(int informationType, byte[] info);

复制代码

      在调用Send方法之前,我们可以先将要发送的内容info进行加密,然后再发送加密后的结果。
      而在接收方,会调用ICustomizeHandler的HandleInformation方法来处理接收到的信息:  

  /// <summary>/// 处理来自客户端的自定义信息。/// </summary>/// <param name="sourceUserID">发送该信息的用户ID</param>/// <param name="informationType">自定义信息类型</param>/// <param name="info">信息</param>  void HandleInformation(string sourceUserID, int informationType, byte[] info);

复制代码

      在实现HandleInformation方法时,我们可以先解密info,然后再进行正常的业务处理。

      无论是挂接IMessageTransformer组件,还是在发送或接收自定义信息时,手动加解密信息,都要注意一点,那就是加解密都是要消耗CPU和内存资源的,对于那些高频通信的消息来说,这个开销是绝不可忽视的。所以,我们应该尽可能的只加密那些极其重要的消息/信息(根据MessageType或InfomationType来进行区分),而不是将所有的消息/信息一视同仁。

3.验证第一个消息

      有的恶意用户,在破解了消息的格式之后,会尝试在不登录的情况下,向服务器发送其他类型的请求消息。ESFramework通信框架支持在服务端对每个连接上收到的第一个消息进行验证,如果验证通不过,则将关闭对应的连接。验证第一个消息的组件的接口是IFirstMessageVerifier:

    public interface IFirstMessageVerifier    {/// <summary>        // 当每个TCP连接建立成功后,将会验证从该连接上接收到的第一个消息。如果通不过验证,服务端TCP引擎将会关闭对应的连接。        /// </summary>/// <param name="firstMessage">TCP连接上的第一个消息</param>/// <param name="address">TCP连接的客户端地址</param>/// <returns>验证是否通过</returns>        bool VerifyFirstMessage(UserAddress address , IMessage firstMessage);    }

复制代码

      我们可以实现这个接口,并将其注入到ITcpServerEngine对应的属性上。当VerifyFirstMessage方法返回false时,表示验证失败,此时,服务端网络引擎将会关闭对应的TCP连接。

      如果我们使用的是ESPlus提供的Rapid引擎,Rapid引擎内部已经实现了IFirstMessageVerifier接口来为我们验证第一个消息,它主要是保证第一个消息必须是Logon消息,再结合前面介绍的登陆账号密码验证,就可以解决恶意用户在未登录的情况下,就进行其它类型的业务请求的情况出现。

4.绑定连接(Session)

      当Logon消息中的帐号密码通过服务端的验证之后,服务端会将该帐号与对应的TCP连接绑定起来,构成一个完整的Session。如果该连接上接收到的后续消息中,只要发现消息头中的UserID与该TCP连接绑定的帐号不一致,则认为该消息为非法消息,此时,服务端网络引擎将会关闭对应的TCP连接。如此,可以防止用一个帐号登录成功后,再用另一个帐号来请求服务。

5.空连接

      到这里,我们已经解决了本文开始提出的前三个问题,这就保证了恶意用户无法向服务器发送恶意的消息了。但是,恶意用户在应用层还可以做一件事情,就是消耗服务端的TCP连接。对于每个已成功建立的TCP连接,服务端都要为其分配一定的资源并对其进行管理。如果恶意的用户和服务器之间建立很多空闲的连接,对服务器资源的消耗也是不可忽视的。

      ESFramework通信框架提供的服务端引擎ITcpServerEngine支持及时地关闭上述的恶意用户的空闲连接。ITcpServerEngine有一个ExpiredSpanInSecs属性,该属性的含义是:某个TCP连接连上后,如果在ExpiredSpanInSecs时间内服务端网络引擎都接收不到来自该连接的任何数据,则将关闭该连接。

      一般正常的TCP连接建立成功后,客户端会立即向服务器发送Logon消息进行登录。所以,这个机制是可以成立的。我们可以将ExpiredSpanInSecs设为一个有效值(如3s),来减轻空连接的影响。之所以说是“减轻”,而不是“消除”,是因为在应用层系统中,无法完全规避这个问题,就按照3秒钟的超时来说,你服务端关闭连接的速度一定赶不上恶意用户建立连接的速度。

      解决这个问题的更好办法,应该是在防火墙上做相关的策略设定,比如屏蔽掉恶意用户的IP地址,过滤由该地址发出TCP握手请求的Syn包,等等。

时间: 2024-07-30 01:54:46

ESFramework 通信框架安全机制的设计与实现的相关文章

可靠通信的保障 —— 使用ACK机制发送自定义信息——ESFramework 通信框架4.0 快速上手(12)

      (本文所介绍的新功能位于2011.04.18发布的最新版本中,此次版本变更请参见ESFramework通信框架通信框架 4.0 版本升级说明(持续更新))       使用ESPlus.Application.CustomizeInfo.Passive.ICustomizeInfoOutter接口的Send方法,我们已经可以给服务端或其它在线客户端发送自定义信息了,那么,如何得知接收方是否已经收到了我们发出的信息了呢?特别是针对一些非常重要的信息,确认对方已经收到是非常重要的.ICu

网络通信应用开发利器!—— ESPlus —— ESFramework通信框架的增强库

概述 ESPlus 是基于网络通信框架ESFramework通信框架通信框架的增强库.为了更贴近实际应用,加快网络通信系统的开发,ESPlus在ESFramework通信框架原生功能的基础上,进行了再次封装,提供了大多数通信系统中经常用到的组件和功能.在这些功能中,最主要的是:自定义信息.基础API与状态通知.文件传送.P2P框架.好友关系.组关系.Rapid引擎.  1.自定义信息 使用通信框架最基础的需求就是收发信息,ESPlus底层已经为我们封装好了所有与信息收发相关的操作,我们只要调用I

ESFramework网络通信框架介绍之(3)――消息处理器和处理器工厂

一.ESFramework网络通信框架与消息处理器   无论是服务端还是客户端,都需要对接收到的消息进行处理,在ESFramework网络通信框架中,处理消息的组件称为消息处理器,所有的消息处理器都实现了接口IDataDealer:    1     public interface IDataDealer2     {        3         NetMessage  DealRequestMessage(NetMessage reqMsg) ;        4     }    

Apache Mina通信框架架构与应用

Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步 IO 默认使用的是 JAVA NIO 作为底层支持)操作的编程模型.从官网文档"MINA based Application Architecture"中可以看到Mina作为一

【C/S通信交互之HTTP篇】COCOS2DX(CLIENT)使用CURL与JETTY(SERVER)实现手机网游HTTP通信框架(内含解决CURL.H头文件找不到问题)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/870.html 之前已经分享过一篇基于Cocos2dx与服务器使用Socket进行通信的框架,还不太熟悉的请移步到如下博文中: [C/S通信交互之Socket篇]Cocos2dx(Client)使用BSD Socket与Mina(Server)手机网游通信框架! 那么今天Himi来分享如何在cocos2dx中

ESFramework网络通信框架介绍之(2)――网络通信消息NetMessage

ESFramework网络通信框架与元数据 较之C++而言,.NET是一个更加"动态"的平台,其动态能力建立在反射机制之上,而反射的基础是"元数据".     上文已经提到过,如果一个框架要为我们的应用做更多的事情,那么这个框架必须建立更多的标准,必须对框架自己要处理的消息有更多的了解,所以,每个消息都要是自描述的,也就是说每个消息要包含它自己的"元数据".那么,"元数据"位于消息的何处了?你一定想到了,对,是消息头(Mess

ESFramework网络通信框架介绍之(1)――网络通信消息协议接口IContract

一.ESFramework网络通信框架与字节流        通过网络通信的系统之间(如客户端与服务端的通信)要想正常交互,它们必须有"共同的语言",这种语言就是消息协议.遵守消息协议的消息才能被我们的系统所理解.    我们知道,消息在网路上传输的是字节流,而我们主流的面向对象系统中处理的却是"对象",如何将从网络上接收到的字节流转化为"对象",又如何将"对象"转化为字节流以便通过网络传递给其他系统,这便是IContract

ESFramework网络通信框架介绍之(5)――消息分派器IMessageDispatcher

  从2004年7月开始,就一直从事N层C/S架构的服务端的开发,时至今日,慢慢的积累了一些开发经验,ESFramework网络通信框架体系便是这些经验的总结.ESFramework网络通信框架这是一套完全可复用的.灵活的.单纯的.支持N层C/S架构的网络通信框架,内置了对Tcp和Udp协议的支持.ESFramework网络通信框架不仅仅提供了一个基础的C/S框架和大量C/S应用中常用的组件,而且在ESFramework网络通信框架框架之上,引入的一个扩展层--ESFramework网络通信框架

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍

一.前言      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的开发团队,以达到节省开发成本.缩短开发时间,快速适应市场变化的目的.      AgileEAS.NET SOA中间件平台提供了敏捷快速开发软件工程的最佳实践,通过提供大量的基础支撑功能如IOC.ORM.SOA.分布式体系及敏捷并发开发方法所支撑的插件开发体系,以及提供了大量的