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注释实例技巧
Oct 03 PHP
PHP下打开URL地址的几种方法小结
May 16 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
解析php入库和出库
Jun 25 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
PHP中error_reporting()用法详解
Aug 31 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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 json_encode值中大括号与花括号区别
2013/09/30 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
利用Electron简单撸一个Markdown编辑器的方法
2019/06/10 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
python 内置模块详解
2019/01/01 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
python tkinter组件摆放方式详解
2019/09/16 Python
pygame实现五子棋游戏
2019/10/29 Python
什么是Python包的循环导入
2020/09/08 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
工作疏忽检讨书
2014/01/25 职场文书
自荐信需注意事项
2014/01/25 职场文书
升旗仪式主持词
2014/03/19 职场文书
小班幼儿评语大全
2014/04/30 职场文书
国际商务专业求职信
2014/07/15 职场文书
学校学期工作总结
2015/08/13 职场文书
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技