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文件上传实例详解!!!
Jan 02 PHP
thinkphp 多表 事务详解
Jun 17 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
php cookie 详解使用实例
Nov 03 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
简单谈谈 php 文件锁
Feb 19 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 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代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
基于jQuery试卷自动排版系统
2010/07/18 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
JS交换变量的方法
2015/01/21 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
幼儿园户外活动总结
2014/07/04 职场文书
暑期学习心得体会
2014/09/02 职场文书
爱护环境建议书
2015/09/14 职场文书
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
maven依赖的version声明控制方式
2022/01/18 Java/Android
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
Go并发4种方法简明讲解
2022/04/06 Golang
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技