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下使用无限生命期Session的方法
Mar 16 PHP
解析PHP提交后跳转
Jun 23 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
微信公众平台开发教程②微信端分享功能图文详解
Apr 10 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 PHP
php将字符串转换为数组实例讲解
May 05 PHP
基于PHP实现用户在线状态检测
Nov 10 PHP
如何用Laravel包含你自己的帮助函数
May 27 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实现SQL语句格式化功能的方法
2017/07/28 PHP
php7性能提升的原因详解
2019/10/13 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
python访问sqlserver示例
2014/02/10 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
Under Armour澳大利亚官网:美国知名的高端功能性运动品牌
2018/02/22 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
中文系学生自荐信范文
2013/11/13 职场文书
2014年话务员工作总结
2014/11/19 职场文书
道歉信怎么写
2015/05/12 职场文书
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python