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正则校验用户名介绍
Jul 19 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
PHP面向对象精要总结
Nov 07 PHP
PHP制作万年历
Jan 07 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
centos 7.2下搭建LNMP环境教程
Nov 20 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
Yii2框架redis基本应用示例
Jul 13 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 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网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
JavaScript运算符小结
2015/06/03 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
python如何读写csv数据
2018/03/21 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python列表切片常用操作实例解析
2020/03/10 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
python基于win32api实现键盘输入
2020/12/09 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
人事专员的职责
2014/02/26 职场文书
支部鉴定材料
2014/06/02 职场文书
学生安全责任书范本
2014/07/24 职场文书
农行心得体会
2014/09/02 职场文书
大学生实习证明范本
2014/09/19 职场文书
2015大学生实训报告
2014/11/05 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS