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 相关文章推荐
WIN98下Apache1.3.14+PHP4.0.4的安装
Oct 09 PHP
php批量删除数据
Jan 18 PHP
php文件怎么打开 如何执行php文件
Dec 21 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
有关PHP性能优化的介绍
Jun 20 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
php生成动态验证码gif图片
Oct 19 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
Mar 29 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
Apr 26 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
用PHP中的 == 运算符进行字符串比较
2006/11/26 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python django集成cas验证系统
2014/07/14 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python函数的作用域及关键字详解
2019/08/20 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Python版中国省市经纬度
2020/02/11 Python
浅谈Python中的模块
2020/06/10 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
副厂长岗位职责
2014/02/02 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
啦啦队口号大全
2014/06/16 职场文书
干部对照检查材料范文
2014/08/26 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python