PHP防止伪造跨站请求:表单中插入隐藏的随机串

来源:互联网 发布:人力资源网站源码 编辑:程序博客网 时间:2024/04/28 19:36


随机串代码实现

创建一个crumb的实现,代码如下:

 <?php
class Crumb {                                                                                                 
                                                                                                                 
    CONST SALT = "your-secret-salt";                                                        
                                                                
    static $ttl = 7200;                                                                                          
                                                                                                                 
    static public function challenge($data) {                                                                    
        return hash_hmac('md5', $data, self::SALT);                                                              
    }                                                                                                            
                                                                                                                 
    static public function issueCrumb($uid, $action = -1) {                                                      
        $i = ceil(time() / self::$ttl);                                                                          
        return substr(self::challenge($i . $action . $uid), -12, 10);                                            
    }                                                                                                            
                                                                                                                 
    static public function verifyCrumb($uid, $crumb, $action = -1) {                                             
        $i = ceil(time() / self::$ttl);                                                                          
                                                                                                                 
        if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||                                    
            substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)                               
            return true;                                                                                         
                                                                                                                 
        return false;                                                                                            
    }                                                                                                            
                                                                                                                 
}

 

代码中的$uid表示用户唯一标识,而$ttl表示这个随机串的有效时间。

应用示例

构造表单
在表单中插入一个隐藏的随机串crumb

<form method="post" action="demo.php"><input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>"><input type="text" name="content"><input type="submit"></form>

处理表单 demo.php
对crumb进行检查

<?phpif(Crumb::verifyCrumb($uid, $_POST['crumb'])) {    //按照正常流程处理表单} else {    //crumb校验失败,错误提示流程}