博客迁移:时空蚂蚁http://cui.zhbor.com/php
由于有相同的session id包含在请求的Cookie头部中,因此相同的php session将会被访问到。可是,请求里的User-Agent头部跟先前的请求中的信息是不一样的,系统是否能够假定这两个请求是同一个用户发出的?算法
像这种状况下,发现浏览器的头部改变了,可是不能确定这是不是一次来自攻击者的请求的话,比较好的措施就是弹出一个要求输入密码的输入框让用户输入,这样的话,对用户体验的影响不会很大,又能颇有效地防止攻击。浏览器
固然,你能够在系统中加入核查User-Agent头部的代码,相似Listing 3中的代码:安全
<?php session_start(); if (md5($_SERVER['HTTP_USER_AGENT']) != $_SESSION['HTTP_USER_AGENT']) { /* 弹出密码输入框 */ exit; } /* Rest of Code */ ?>
固然,你先必须在第一次请求时,初始化session的时候,用MD5算法加密user agent信息而且保存在session中,相似下面listing4中的代码:cookie
<?php session_start(); $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); ?>
虽然不必定须要用MD5来加密这个User-Agent信息,但使用这种方式之后就不须要再过滤这个$_SERVER['HTTP_USER_AGENT']数据了。否则的话,在使用这个数据之前必需要进行数据过滤,由于任何来自客户端的数据都是不可信任的,必需要注意这一点。session
在你检查这个User-Agent客户端头部信息之后,作为一个攻击者必需要完成两步才能劫持一个session:ui
获取一个合法的session id加密
包含一个相同的User-Agent头部在伪造的请求中spa
你可能会说,竟然攻击者能得到有效的session id,那么以他的水平,伪造一个相同的User-Agent不是件难事。不错,可是咱们能够说这至少给他添加了一些麻烦,在必定程度上也增长了session机制的安全性。设计
你应该也能想到了,既然咱们能够检查User-Agent这个头部来增强安全性,那么不妨再利用其它的一些头部信息,把他们组合起来生成一个加密的token,而且让客户端在后续的请求中携带这个token!这样的话,攻击者基本上不可能猜想出这样一个token是怎么生成出来的。这比如你用信用卡在超市付款,一个你必须有信用卡(比如session id),另外你也必须输入一个支付密码(比如token),这有这二者都符合的状况下,你才能成功进入帐号付款。 看下面一段代码:
<?php session_start(); $token = 'SHIFLETT' . $_SERVER['HTTP_USER_AGENT']; $_SESSION['token'] = md5($token . session_id()); ?>
注意:Accept这个头部不该该被用来生成token,由于有些浏览器会自动改变这个头部,当用户刷新浏览器的时候。
在你的验证机制中加入了这个很是难于猜想出来的token之后,安全性会获得很大的提高。假如这个token经过像session id同样的方式来进行传递,这种状况下,一个攻击者必须完成必要的3步来劫持用户的session:
获取一个合法的session ID
在请求中加入相同的User-Agent头部,用与生成token
在请求中携带被攻击者的token
这里面有个问题。若是session id以及token都是经过GET数据来传递的话,那么对于能获取session ID的攻击者,一样就可以获取到这个token。因此,比较安全靠谱的方式应该是利用两种不一样的数据传递方式来分别传递session id以及token。例如,经过cookie来传递session id,而后经过GET数据来传递token。所以,假如攻击者经过某种手段得到了这个惟一的用户身份标识,也是不太可能同时轻松地获取到这个token,它相对来讲依然是安全的。
还有不少的技术手段能够用来增强你的session机制的安全性。但愿你在大体了解session的内部本质之后,能够设计出适合你的应用系统的验证机制,从而大大的提升系统的安全性。毕竟,你是最熟悉当下你开发的系统的开发者之一,能够根据实际状况来实施一些特有的,额外的安全措施。
以上只是大概地描述了session的工做机制,以及简单地阐述了一些安全措施。但要记住,以上的方法都是可以增强安全性,不是说可以彻底保护你的系统,但愿读者本身再去调研相关内容。在这个调研过程当中,相信你会学到颇有实际使用价值的方案。