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 文章调用类代码
Aug 11 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
Jun 20 PHP
php数组查找函数总结
Nov 18 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
yii通过小物件生成view的方法
Oct 08 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
php实现查询功能(数据访问)
May 23 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
关于laravel框架中的常用目录路径函数
Oct 23 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调用三种数据库的方法(3)
2006/10/09 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
javascript 清除输入框中的数据
2009/04/13 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
python自动化测试实例解析
2014/09/28 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
详解Python传入参数的几种方法
2019/05/16 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
五分钟演讲稿
2014/04/30 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
出国导师推荐信
2015/03/25 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
Python使用Kubernetes API访问集群
2021/05/30 Python
pandas中关于apply+lambda的应用
2022/02/28 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
Python简易开发之制作计算器
2022/04/28 Python
Android实现图片九宫格
2022/06/28 Java/Android