一、简介
随着Internet的普及和发展,网络这块净土也被黑客盯上而屡屡出现一些风波,比如重要网站被黑、商务站点受到影响等等,这些事例都是数不胜举。虽然这些事情和我们普通老百 姓都是相距甚远的,但还是给网友们带来了不便,要想有效的防护自己的,首先就要知晓对方会采取何种破坏和攻击手段。
实际上存在着许多的聊天工具,比如可以通过V2登入到BBS进行聊天,也可以通过IRC协议进行及时的聊天,比如象ICQ、MSN和国内的OICQ软件都属于这种形式的聊天。
各种聊天工具都有它们自己的优缺点,比如IRC协议因为是完全基于字符的,所以速度比较快。还有网站的聊天,该聊天系统的特点是用户注册登入以后,把用户浏览页面的情况实时的发送到相关的服务器上,这样,所有在同一个网站上面的用户就可以实时的进行沟通。基于Web的聊天服务器系统的最大的优点是完全基于浏览器和Web服务器的,所以用户不需要任何其他的客户端的工具,而且由于浏览器完全支持多媒体形式,所以传输的内容可以非常丰富多彩。
二、聊天室存在的攻击行为
我们知道浏览器实际上除了和Web服务器进行消息的传送以外,还负责对服务器发送回来的HTML页面进行解析,而现在几乎所有的浏览器都支持JavaScript,这样如果用户在发送信息的时候,不是发送正常的文本而是一些带标记的HTML语言甚至是JavaScript的时候,如果这些语句又是一些恶意的程序代码,就会对用户造成损害。
另外,用户可以通过代理截获所有发送和接收的数据包,通过自己编写的应用程序不停的向服务器发送类似格式的数据包使服务器不能处理其他用户的信息包,能够这样做的原因是因为浏览器和Web服务器通讯并不是通过一个固定的Socket连接进行的,服务器端实际上只是判别数据包本身的合法性,并不判断数据包是从哪个IP地址和哪个Port端口发送的。而浏览器是每次发送数据包的时候和服务器建立一个Socket连接,当该次传送完成后连接就会断开。
现在基于Web的聊天室有一般有两种形式:一种是需要用户认证的,即用户在登入服务器以前必须进行注册,一种是不需要认证的,即用户只需要用一个Nickname就可以登入到聊天室中,只要该聊天室中还不存在这个NickName就可以了。关于用户的消息处理,现在几乎所有的聊天室都关闭了对HTML和Javascript的支持,或者是仅仅允许一部分用户(比如聊天室的系统管理员等)使用这些功能。
三、需要注意的问题和防范
??由于OICQ是用户间的直接连接,所以很容易被查出IP地址而受到攻击,在解决了单机上的安全问题之后,我们面对的将是如何在网络上进行防护。
??首先,建议大家要安装防火墙程序。
目前比较好的防火墙有LockDown 2000、ZoneAlarm和天网等等,这些工具都有汉化的版本,因此使用方面应该是没有太大的问题。如果在这些防火墙程序中将安全等级设置为“高”的话,它们就会对网络上发送和接收的每一个字节进行监测,同时也会对指定的端口进行实时的查看,一旦发现有非正常的数据包企图进入计算机系统,它们就会加以拦截。
关于信息长度的限制:
一般来说,在服务器发送给浏览器端的HTML中含有的JavaScript会对用户输入的信息做检查,防止信息超过一定的长度,但是实际上用户可以不通过浏览器,自己生成数据包发送到服务器端,所以为了防止用户发送过长的数据包,需要在服务器端检查用户的数据包的长度。当然这里同时需要注意的是要在用户登入的时候在服务器端检查用户名称和密码的最大长度,同时如果设定了用户性别的话,也要设定其长度限制,事实上如果用户是通过浏览器方式的话,因为在服务器发送给客户的HTML文本中已经通过JavaScript剧本做了限定,一般不会有问题,但是要考虑用户通过自己合成数据包发送类似信息所产生的问题。
数据包内容的判断:
因为恶意用户可能会在发送的信息中含有恶意的JavaScript代码或者是HTML代码,如果这样的信息包在服务器端不经过处理而直接传送到其他用户的浏览器上的话,就会造成其他用户的浏览器不停的打开新的窗口,直到耗尽系统的资源。其他的比如发送特大的图象或者是其他的多媒体文件到指定的客户端就会对该客户端用户造成不良的影响。所以一般我们需要对用户发送的信息进行处理,屏蔽这些HTML语句和Javascript语句。因为所有的命令都是包含在“<>”里面的,所以最简单的方法就是当服务器接收到“<>”字符的时候,只把“<>”看成是普通的字符而不是命令的标志符,就可以避免这个问题。当然为了增加聊天的趣味性,可以对某一些可信任的用户开放这些功能。
用户身份的鉴别:
很多聊天室在传送数据包的时候,只是根据网页中隐含的字段得到用户的名称作为用户的标识来发送信息。比如国内比较典型的聊天站点(www.XXXXX.net)的用户的发送信息的数据包的格式是这样的:GEhttp://chat.XXXXX.net/BANNER?USER=username&;
SAYS=%3Ch2%3Ethis+is+test%3C%2Fh2%3E&IMG=&IMGURL=&
WHOTO=%CB%F9%D3%D0%C8% CB&ACTION=%CB%B5%BB%B0&as=on&msg=HTTP/1.0 其中username就是表示该数据包是这个用户发送的。这样我们就很容易自己构建一个类似的数据包,而把用户名称替换成其他任何我们想要替换的人的名称,这样聊天室中的信息就会变得比较混乱,搞不清楚消息到底是谁发送的。
为了避免这个问题,我们的解决方案是这样的,当用户首次登入的时候,服务器系统应该生成一个唯一的sessionID来标识这个用户,这样,每次用户发送的数据包中必须包括这个sessionID,服务器根据这个sessionID来识别是否是该用户发送的消息,如果是一个不合法的sessionID的话,就简单的丢弃这个数据包。因为sessionID是在服务器端随机生成的,所以用户很难自己构造一个合法的sessionID来欺骗服务器,保证了信息来源的可靠性。当然如果服务器需要用户首先注册的话,可以同时检查用户的密码和sessionID是否匹配,这样用户伪造其他用户的信息的可能性就会更小。
关于用户发送重复的信息和自动循环发送随机信息(即通常所说的聊天室刷屏现象)的处理:
如果用户只是通过浏览器操作的话,服务器传送给用户的HTML文本中包含的Javascript就会在用户发送消息的时候比较用户的本次信息是否和上次信息相一致,如果是相一致的话,系统就不会发送本次信息并给出警告。而且如果用户是在浏览器上进行操作的话,用户的信息发送间隔会受到手工操作的限制。但是,如果用户是通过自己的应用程序发送数据包的话,就不会有这个限制。实际上用户可以在一个线程中不断对服务器循环发送数据包。所以系统不仅要考虑在客户端有这个限制,还需要在服务器端进行限制。
我们的解决方案是这样的,对所有在线的用户,我们建立了一个用户池,它实际上是一个用户对象的链表,每一个用户对象包含了用户的名称,用户的sessionID,用户的上一句发言的信息和用户上一句发言的时间。实际上这个用户池也是滚动的,如果用户在最近一段时间内没有任何信息,我们就认为该用户已经不在线上,就从信息池中删除该用户,以便为其他用户的连接让出资源。如果用户发送的消息和上一次消息相同的话,就简单的丢弃用户的这个数据包,如果用户这次消息的发送时间和上一次时间间隔小于一定范围(比如一秒)的话,我们就认为这种数据发送速率是非正常的,就简单的从用户池中删除这个用户,断掉这个连接。通过这种解决方法有效的解决了用户刷屏和发送重复消息的问题。
四、小结
本文介绍了Internet的聊天系统和不同的特点,重点介绍了聊天室存在的问题和一些攻击行为的防范,虽然黑客猖獗,不过胜利始终是属于正义一方的。