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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
PHP PDO函数库详解
Apr 27 PHP
php中随机显示图片的函数代码
Jun 23 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
php中各种定义变量的方法小结
Oct 18 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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中{}大括号是什么意思
2013/12/01 PHP
php+ajax实现的点击浏览量加1
2015/04/16 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
YII2框架使用控制台命令的方法分析
2020/03/18 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
Python字符串中查找子串小技巧
2015/04/10 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
Python 读取位于包中的数据文件
2020/08/07 Python
python字典与json转换的方法总结
2020/12/28 Python
求职简历推荐信范文
2013/12/02 职场文书
建议书标准格式
2014/03/12 职场文书
协议书格式
2014/04/23 职场文书
爱心捐助倡议书
2014/05/19 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
城南旧事电影观后感
2015/06/16 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python