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 和 HTML
Oct 09 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
基于MySQL体系结构的分析
May 02 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
Jun 21 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
Codeigniter框架实现获取分页数据和总条数的方法
Dec 05 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
php制作动态随机验证码
Feb 12 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
桌面中心(四)数据显示
2006/10/09 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
实例解析Python中的__new__特殊方法
2016/06/02 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python 数据结构之队列的实现
2017/01/22 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
python 如何实现遗传算法
2020/09/22 Python
教师通用专业自荐书范文
2014/02/11 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
黄金酒广告词
2014/03/21 职场文书
德育标兵事迹材料
2014/08/24 职场文书
学习十八大宣传标语
2014/10/09 职场文书
债务纠纷代理词
2015/05/25 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis