php安全开发 添加随机字符串验证,防止伪造跨站请求

yipeiwu_com6年前PHP代码库

yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg。

比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。现在防范方法基本上都是基于这种方法的了

随机串代码实现
咱们按照这个思路,山寨一个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进行检查
复制代码 代码如下:

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


本文出自包子博客

相关文章

php使用ZipArchive函数实现文件的压缩与解压缩

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法这里就不说了,不同的平台开启PHP扩增的...

PHP字符串比较函数strcmp()和strcasecmp()使用总结

比较字符串是任何编程语言的字符串处理功能中重要的特性之一。在PHP中除了可以使用比较运算符号(==、<或>)加以比较外,还提供了一系列的比较函数,使PHP可以进行更复杂的字符...

php header 详细使用说明与使用心得第1/2页

不管页面有多少header,它会执行最后一个,不过是有条件的,例如: header('Location://www.jb51.net'); header('Location:http:/...

PHP判断FORM表单或URL参数来的数据是否为整数的方法

PHP判断FORM表单或URL参数来的数据是否为整数,is_int函数对于FORM表单或URL参数过来的数据是没有办法判断是否是整数的,因为FORM过来的是字符串。 用is_numeri...

基于PHP常用字符串的总结(待续)

1.分割与合并implode:echo implode(",", array('lastname', 'email', 'phone'));//数组转成字符串explode:print_...