사용자 로그인의 쿠키 정보 보안

14347 단어 cookie
모두가 알다시피 사용자가 로그인한 후에 사용자 정보는 일반적으로 쿠키에 저장하는 것을 선택한다. 왜냐하면 쿠키는 클라이언트를 저장하고 쿠키는 클라이언트가 브라우저로 자유롭게 변경할 수 있기 때문에 사용자 쿠키가 위조될 위험이 존재하고 위조 쿠키를 만든 사람이 임의의 사용자의 계정에 로그인할 수 있다.다음은 일반적인 사용자 로그인을 방지하는 쿠키 정보의 안전 방법을 말한다. 첫째, 쿠키 정보 암호화법 쿠키 정보 암호화법은 일종의 암호화 방법으로 사용자 정보를 암호화한 다음에 쿠키를 저장한다. 이렇게 하면 위조자는 쿠키를 받아도 쿠키 유효기간 내에 이 쿠키를 이용할 수 있고 다른 쿠키 정보를 위조할 수 없다.
여기에는 다음과 같은 암호화 함수가 첨부되어 있습니다.
<!--?php



function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {   



    //



    $ckey_length = 4;   



       



    //      



    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);   



       



    //   a         



    $keya = md5(substr($key, 0, 16));   



    //   b              



    $keyb = md5(substr($key, 16, 16));   



    //   c            



    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): 



substr(md5(microtime()), -$ckey_length)) : '';   



    //           



    $cryptkey = $keya.md5($keya.$keyc);   



    $key_length = strlen($cryptkey);   



    //   , 10        ,          ,10 26     $keyb(  b), 



//                    



    //        ,   $ckey_length   ,     $ckey_length        ,          



    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :  



sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;   



    $string_length = strlen($string);   



    $result = '';   



    $box = range(0, 255);   



    $rndkey = array();   



    //         



    for($i = 0; $i <= 255; $i++) {   



        $rndkey[$i] = ord($cryptkey[$i % $key_length]);   



    }   



    //       ,     ,     ,     ,                 



    for($j = $i = 0; $i < 256; $i++) {   



        $j = ($j + $box[$i] + $rndkey[$i]) % 256;   



        $tmp = $box[$i];   



        $box[$i] = $box[$j];   



        $box[$j] = $tmp;   



    }   



    //           



    for($a = $j = $i = 0; $i < $string_length; $i++) {   



        $a = ($a + 1) % 256;   



        $j = ($j + $box[$a]) % 256;   



        $tmp = $box[$a];   



        $box[$a] = $box[$j];   



        $box[$j] = $tmp;   



        //



        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));   



    }   



    if($operation == 'DECODE') {  



        //



        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() --> 0) &&  



substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {   



            return substr($result, 26);   



        } else {   



            return '';   



        }   



    } else {   



        //            ,           ,                



        //                  ,         ,   base64     



        return $keyc.str_replace('=', '', base64_encode($result));   



    }   



} 





 



$str = 'abcdef'; 



$key = 'www.phpskill.com'; 



echo $jm = authcode($str,'ENCODE',$key,0); //   

echo "

";



echo authcode($jm ,'DECODE',$key,0); //  



?>

이렇게 하면 사용자 정보의 쿠키를 설정할 때 이를 위조할 수 없습니다.
<!--?php



$user = array("uid"=-->$uid,"username"=>$username);



$user = base64_encode(serialize($user));

$user =  authcode($user,'ENCODE','www.phpskill.com',0); //   

setcookie("user",$user,time()+3600*24);



?>

2. 암호화 토큰으로 쿠키 보호
$hash = md5($uid.time());//     

$hash_expire =time()+3600*24;//           

$user = array("uid"=>$uid,"username"=>$username,"hash"=>$hash);



$user = base64_encode(serialize($user));



setcookie("user",$user,$hash_expr);



   $hash $hash_expire   member  hash hash_expire     ,     nosql,session



    cookie ,hash    ,   hash         



      ,  hash_expire       hash ,     

 
php 순수 기술 교류군:323899029
텍스트 전재:http://www.phpskill.com/html/show-1-4424-1.html

좋은 웹페이지 즐겨찾기