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集成FCK的函数代码
Sep 27 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
php 处理上百万条的数据库如何提高处理查询速度
Feb 08 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
May 13 PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
Jun 14 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
模仿OSO的论坛(三)
2006/10/09 PHP
php中目录,文件操作详谈
2007/03/19 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP反射实际应用示例
2019/04/03 PHP
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
js倒计时显示实例
2016/12/11 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
webpack打包js的方法
2018/03/12 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
Python多继承原理与用法示例
2018/08/23 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
python collections模块的使用
2020/10/16 Python
python matlab库简单用法讲解
2020/12/31 Python
Linux上比较文件的命令都有哪些
2012/02/24 面试题
编辑找工作求职信范文
2013/12/16 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
医学会议开幕词
2016/03/03 职场文书
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫