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校验失败,错误提示流程   
}

本文出自包子博客

(0)

相关推荐

  • php获取指定数量随机字符串的方法

    本文实例讲述了php获取指定数量随机字符串的方法.分享给大家供大家参考,具体如下: function getARandLetter($number = 1) { if ($number == 0) return FALSE; //去除0 $number = $number < 0 ? - $number : $number; //如果小于零取正值 $letterArr = array ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',

  • PHP生成随机字符串(3种方法)

    如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码.随机密码也就是一串固定长度的字符串,文章整理了几种生成随机字符串的方法. 方法一 1.在33 – 126中生成一个随机整数,如35. 2.将35转换成对应的ASCII码字符,如35对应#. 3.重复以上1.2步骤n次,连接成n位的密码. 该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,其中 $min – $max 为 ASCII 码的范围,这里取 33 -126 ,可以根据

  • PHP 可阅读随机字符串代码

    复制代码 代码如下: /************** *@length - length of random string (must be a multiple of 2) **************/ function readable_random_string($length = 6){ $conso=array("b","c","d","f","g","h","j&

  • php使用指定字符列表生成随机字符串的方法

    本文实例讲述了php使用指定字符列表生成随机字符串的方法.分享给大家供大家参考.具体如下: <?php function randomString($len) { srand(date("s")); $possible="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()"; $str=""; while(strlen($str)<$

  • PHP生成指定随机字符串的简单实现方法

    本文实例讲述了PHP生成指定随机字符串的简单实现方法.分享给大家供大家参考.具体分析如下: 这是一个简单的函数,没有对生成的内容作强制设定.所以在生成的字符串长度较少的时候,会出现没有指定类型字符的情况.当然,修改起来也很简单,这里就不做添加了. /** * @param string $type * @param $length * @return string */ function randomString($type="number,upper,lower",$length){

  • PHP产生随机字符串函数

    <?php /**   * 产生随机字符串   *   * 产生一个指定长度的随机字符串,并返回给用户   *   * @access public   * @param int $len 产生字符串的位数   * @return string   */   function randStr($len=6) {   $chars='ABDEFGHJKLMNPQRSTVWXYabdefghijkmnpqrstvwxy23456789#%*'; // characters to build the 

  • php使用str_shuffle()函数生成随机字符串的方法分析

    本文实例讲述了php使用str_shuffle()函数生成随机字符串的方法.分享给大家供大家参考,具体如下: str_shuffle():随机打乱字符串的顺序. 可以通过str_shuffle()函数与substr()函数的组合,生成每次都不一样的字符串. 以下是str_shuffle()函数的两个示例: 示例一:随机生成长度为10位数字的字符串. $str="QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm"

  • PHP随机字符串生成代码(包括大小写字母)

    第一种:利用字符串函数操作 复制代码 代码如下: <?php function createRandomStr($length){ $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符 $strlen = 62; while($length > $strlen){ $str .= $str; $strlen += 62; } $str = str_shuffle($str); return

  • PHP生成自定义长度随机字符串的函数分享

    php随机生成字符串可以自己定义自己所需要的长度,在实际应用开发中,经常遇到. 复制代码 代码如下: //随机生成字符串function random($length) {     srand(date("s"));     $possible_charactors = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";     $string = "";     while(strlen($string)<$l

  • 生成随机字符串和验证码的类的PHP实例

    网上有很多的php随机数与验证码的代码与文章,真正适用的没有几个. 索性自己搞一个吧. 开始本节的php教程 吧,以下代码的实现,主要做到可以很好区分一个get_code(),另一个create_check_image(),输出图像直接调用后面的,session()取验证码时直接get_code()就ok,顺带提下使用session时必须将session_star()放在最前面. 代码如下: 复制代码 代码如下: <?phpclass RandCheckCode{        /*函数名称:g

  • php简单随机字符串生成方法示例

    本文实例讲述了php简单随机字符串生成方法.分享给大家供大家参考,具体如下: <?php function rand_str($length,$p='all'){ $nums = '0123456789'; $lowers = 'abcdefghijklmnopqrstuvwxyz'; $uppers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; if ($p == 'all') { $src = $nums.$lowers.$uppers; } else { $src = '

  • PHP 一个随机字符串生成代码

    复制代码 代码如下: /************* *@l - length of random string */ function generate_rand($l){ $c= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; srand((double)microtime()*1000000); for($i=0; $i<$l; $i++) { $rand.= $c[rand()%strlen

  • php生成随机字符串可指定纯数字、纯字母或者混合的

    php 生成随机字符串 可以指定是纯数字 还是纯字母 或者混合的. 可以指定长度的. 复制代码 代码如下: function rand_zifu($what,$number){ $string=''; for($i = 1; $i <= $number; $i++){ //混合 $panduan=1; if($what == 3){ if(rand(1,2)==1){ $what=1; }else{ $what=2; } $panduan=2; } //数字 if($what==1){ $str

随机推荐