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制作静态网站的模板框架(二)
Oct 09 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
php计算税后工资的方法
Jul 28 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
Laravel定时任务的每秒执行代码
Oct 22 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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安装攻略:常见问题解答(一)
2006/10/09 PHP
很可爱的输入框
2008/08/03 Javascript
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
小程序实现搜索框
2020/06/19 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
python实现按行切分文本文件的方法
2016/04/18 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
python右对齐的实例方法
2020/07/05 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
银行见习期自我鉴定
2014/01/29 职场文书
实习证明格式范文
2014/10/14 职场文书
给领导敬酒词
2015/08/12 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电