php中防止伪造跨站请求的小招式


Posted in PHP onSeptember 02, 2011

伪造跨站请求介绍

伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等。这种攻击常见的表现形式有:

伪造链接,引诱用户点击,或是让用户在不知情的情况下访问

伪造表单,引诱用户提交。表单可以是隐藏的,用图片或链接的形式伪装。

比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。

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 if 想到的些问题
Mar 22 PHP
一些 PHP 管理系统程序中的后门
Aug 05 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 PHP
PHP取余函数介绍MOD(x,y)与x%y
May 15 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
php将文本文件转换csv输出的方法
Dec 31 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
Yii2 queue的队列使用详解
Jul 19 PHP
10个实用的PHP代码片段
Sep 02 #PHP
PHP文件操作实现代码分享
Sep 01 #PHP
深入探讨PHP中的内存管理问题
Aug 31 #PHP
php中使用Imagick实现图像直方图的实现代码
Aug 30 #PHP
PHP正确配置mysql(apache环境)
Aug 28 #PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 #PHP
PHP 时间日期操作实战
Aug 26 #PHP
You might like
递归实现php数组转xml的代码分享
2015/05/14 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python制作刷网页流量工具
2017/04/23 Python
Python对象属性自动更新操作示例
2018/06/15 Python
python批量修改图片大小的方法
2018/07/24 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
员工培训心得体会
2013/12/30 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
学生旷课检讨书500字
2014/10/28 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书