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 相关文章推荐
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
Apr 29 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
May 12 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 PHP
PHP中抽象类和抽象方法概念与用法分析
May 24 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
php实现微信模板消息推送
Mar 30 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
thinkphp5.1 框架钩子和行为用法实例分析
May 25 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
Firefox div高度自适应
2009/04/28 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
教你使用python画一朵花送女朋友
2018/03/29 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
先进工作者获奖感言
2014/02/08 职场文书
前处理班长职位说明书
2014/03/01 职场文书
2014年党务工作总结
2014/11/25 职场文书
实习班主任自我评价
2015/03/11 职场文书
北京爱情故事观后感
2015/06/12 职场文书
叶问观后感
2015/06/15 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
Python并发编程实例教程之线程的玩法
2021/06/20 Python