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 相关文章推荐
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
JavaScript知识点整理
2015/12/09 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
vue resource发送请求的几种方式
2019/09/30 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
Python异常学习笔记
2015/02/03 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
Python Selenium库的基本使用教程
2021/01/04 Python
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
党员志愿者活动总结
2014/06/26 职场文书
golang中的空接口使用详解
2021/03/30 Python
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技