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


Posted in PHP onFebruary 14, 2013

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 相关文章推荐
一篇入门的php Class 文章
Apr 04 PHP
PHP 生成的XML以FLASH获取为乱码终极解决
Aug 07 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
PHP 截取字符串专题集合
Aug 19 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
Sep 28 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
php结合curl实现多线程抓取
Jul 09 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 #PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 #PHP
PHP-redis中文文档介绍
Feb 07 #PHP
php中使用redis队列操作实例代码
Feb 07 #PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 #PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 #PHP
在smarty中调用php内置函数的方法
Feb 07 #PHP
You might like
php实现的MySQL通用查询程序
2007/03/11 PHP
PHP实现合并discuz用户
2015/08/05 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
javascript 写类方式之十
2009/07/05 Javascript
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
用python制作游戏外挂
2018/01/04 Python
django 将model转换为字典的方法示例
2018/10/16 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
雷蛇美国官网:Razer
2020/04/03 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
进步之星获奖感言
2014/02/22 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
会计试用期自我评价
2015/03/10 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript