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 操作excel文件的方法小结
Dec 31 PHP
php懒人函数 自动添加数据
Jun 28 PHP
浅析echo(),print(),print_r(),return之间的区别
Nov 27 PHP
sae使用smarty模板的方法
Dec 17 PHP
php跨域cookie共享使用方法
Feb 20 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
PHP Include文件实例讲解
Feb 15 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 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
php类常量用法实例分析
2015/07/09 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解python的数字类型变量与其方法
2016/11/20 Python
python机器人行走步数问题的解决
2018/01/29 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
十一个高级MySql面试题
2014/10/06 面试题
工地门卫岗位职责范本
2014/07/01 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
pandas中关于apply+lambda的应用
2022/02/28 Python
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python