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 相关文章推荐
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
Dec 01 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
对PHP新手的一些建议(PHP学习经验总结)
Aug 20 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
Mar 14 PHP
PHP实现留言板功能的详细代码
Mar 25 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 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/06/23 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
Json解析的方法小结
2016/06/22 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
layui type2 通过url给iframe子页面传值的例子
2019/09/06 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
python集合的新增元素方法整理
2020/12/07 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
给物业的表扬信
2014/01/21 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
公务员年度考核评语
2014/12/31 职场文书
党支部综合考察意见
2015/06/01 职场文书
同意报考公务员证明
2015/06/17 职场文书