php csrf防御

来源:互联网 发布:淘宝首页自定义间隙 编辑:程序博客网 时间:2024/05/17 02:24
  1. <?php  
  2. session_start();  
  3.   
  4. class CSRF {  
  5.     protected static $originCheck = true; //来源控制  
  6.       
  7.     //根据token   生成session token  
  8.     public static function _set_Token( $key=null ) {  
  9.         if (empty($key))   
  10.             throw new Exception("key为NULL");  
  11.           
  12.         $extra = self::$originCheck ? sha1( $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] ) : ''//判断是否启用来源验证  
  13.           
  14.         $token = base64_encode( time() . $extra . self::_getString( 32 ) ); //一起加密  
  15.           
  16.         $_SESSION'csrf_' . $key ] = $token//放入session  
  17.           
  18.         return $token;  
  19.     }  
  20.       
  21.     //生成字符串  
  22.     protected static function _getString( $length ) {  
  23.         $text = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijqlmnopqrtsuvwxyz0123456789';  
  24.         $max = strlen$text ) - 1;  
  25.           
  26.         $string = '';  
  27.         for ( $i = 0; $i < $length; ++$i )  
  28.             $string .= $text{intval( mt_rand( 0.0, $max ) )};  
  29.           
  30.         return $string;  
  31.     }  
  32.       
  33.     //放入隐藏域   
  34.     public static function _set_Input_Token( $key ) {  
  35.         echo "<input type='hidden' name='token' value='".$_SESSION[ 'csrf_' . $key ]."'>";  
  36.     }  
  37.       
  38.     //生成token过期时间  
  39.       
  40.     protected static function _set_Time() {  
  41.         $_SESSION['token_time'] = time();  
  42.     }  
  43.       
  44.     //init初始化  
  45.     public function _init( $token ) {  
  46.         CSRF::_set_Token($token);  
  47.         CSRF::_set_Input_Token($token);  
  48.         CSRF::_set_Time();  
  49.     }  
  50. }  
[php] view plain copy
  1. <pre name="code" class="html"><!doctype html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>Document</title>  
  6. </head>  
  7. <body>  
  8.     <form action="verifyCsrf.class.php" method="post" >  
  9.     <?php  
  10.         require_once 'getCSRF.php';  
  11.         $c = new CSRF();  
  12.         $c->_init('token');  
  13.     ?>  
  14.     用户名:<input type="text" name="username">  
  15.     <input type="submit" value="提交">  
  16.     </form>  
  17. </body>  
  18. </html>  


[php] view plain copy
  1. <pre name="code" class="php"><?php  
  2. session_start();  
  3.   
  4. class verifyCsrf{  
  5.       
  6.     protected static $originCheck = true; //来源控制  
  7.     public $token;  
  8.     public $time_token;  
  9.       
  10.     public static function _checkToken( $key$origin ){  
  11.         if ( !isset( $_SESSION'csrf_' . $key ] ) )  
  12.             return false;  
  13.           
  14.         if ( !isset( $origin$key ] ) )  
  15.             return false;  
  16.               
  17.         $hash = $_SESSION'csrf_' . $key ]; //获取存在session中的token  
  18.           
  19.         //验证来源  根据加密验证  
  20.         if( self::$originCheck && sha1( $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] ) != substrbase64_decode$hash ), 10, 40 ) )   
  21.             return false;  
  22.           
  23.         //验证token  
  24.         if ( $origin$key ] != $hash )  
  25.             return false;  
  26.           
  27.         //验证时间  
  28.         $expired_time = time() - $_SESSION['token_time'];  
  29.         if ($expired_time >= 300)  
  30.             return false;  
  31.           
  32.         return true;  
  33.     }  
  34.   
  35.       
  36.     //跳转  
  37.     public static function _jump() {  
  38.         header("Location: " . $_SERVER['HTTP_REFERER']);  
  39.     }  
  40.       
  41. }  
  42.   
  43. $post['token'] = $_POST['token'];  
  44.   
  45. $vc = verifyCsrf::_checkToken('token',$post);  
  46.   
  47. if ($vc === true) {  
  48.     //  
  49.     print_r('success');  
  50. else {  
  51.     verifyCsrf::_jump();  
  52. }  
  53. 转自:http://blog.csdn.net/GT219/article/details/51026308
原创粉丝点击