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 ?>
待续……