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 09 PHP
php与mysql建立连接并执行SQL语句的代码
Jul 04 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
PHP函数in_array()使用详解
Aug 20 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
PHP中返回引用类型的方法
Apr 03 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 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检测移动设备类mobile detection使用实例
2014/04/14 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
PHP中SESSION过期设置
2021/03/09 PHP
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
javascript中的this详解
2014/12/08 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
500行python代码实现飞机大战
2020/04/24 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
民间借贷协议书范本
2014/10/01 职场文书
迎新生欢迎词
2015/01/23 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
2015年重阳节主持词
2015/07/04 职场文书
预备党员入党感想
2015/08/10 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang