有关session安全的那些事儿

1.session劫持

  动机:想要确保攻击者无法访问站点其他用户的session

  方案:只允许通过cookie来传递sessionID,同时生成一个由URL传递的额外的session记号(token),只有当请求包含有效的sessionID和有效的session记号时,才可以访问该session

  代码:

 1 <?php
 2 ini_set('session.use_only_cookies',true);
 3 session_start();
 4 $salt = '!@@##~~WEQQ';
 5 $tokenstr = (str)data('W').$salt;
 6 $token = md5($tokenstr);
 7 if(!isset($_REQUEST['token'])||$_REQUEST['token']!=$token){
 8     //提示登录
 9     exit;
10 }
11 $_SESSION['token'] = $token;
12 output_add_rewrite_var('token',$token);
13 ?>

  output_add_rewrite_var函数说明

官方:添加URL重写器的值(Add URL rewriter values)
说明:bool output_add_rewrite_var ( string $name , string $value )
此函数给URL重写机制添加名/值对。 这种名值对将被添加到URL(以GET参数的形式)和表单(以input隐藏域的形式),当透明URL重写用 session.use_trans_sid 开启时同样可以添加到session ID。 要注意,绝对URL(http://example.com/..)不能被重写。
适用范围:(PHP 4 >= 4.3.0, PHP 5)

  如果你的php版本低于4.3.0,对不起这个方法还不能生效,不过不用着急,我们有替代方法

  上代码:

 1 <?php
 2 ini_set('session.use_only_cookies',true);
 3 session_start();
 4 $salt = '!@@##~~WEQQ';
 5 $tokenstr = (str)data('W').$salt;
 6 $token = md5($tokenstr);
 7 if(!isset($_REQUEST['token'])||$_REQUEST['token']!=$token){
 8     //提示登录
 9     exit;
10 }
11 $_SESSION['token'] = $token;
12 ob_start('inject_session_token');
13 function inject_session_token($buffer){
14     $hyperlink_pattern = "/<a[^>]+href=\"([^\"]+)/i";
15     preg_match_all($hyperlink_patten,$buffer,$matches);
16     foreach($matches[1] as $link){
17         if(strpos($link,"?")===false){
18             $newlink = $link.'?token='.$_SESSION['token'];
19         }else{
20             $newlink = $link.='&token='.$_SESSION['token'];
21         }
22         $buffer = str_replace($link,$newlink,$buffer);
23     }
24     return $buffer;
25 }
26 ?>

待续……

posted @ 2013-04-11 23:31  MR.Punk  阅读(242)  评论(0编辑  收藏  举报