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 相关文章推荐
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
PHP 时间日期操作实战
Aug 26 PHP
php获取字段名示例分享
Mar 03 PHP
php设计模式之委托模式
Feb 13 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
php字符串操作常见问题小结
Oct 11 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
Laravel 实现密码重置功能
Feb 23 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
PHP默认安装产生系统漏洞
2006/10/09 PHP
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
浅析PHP文件下载原理
2014/12/25 PHP
PHP strripos函数用法总结
2019/02/11 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
Bootstrap表单布局
2016/07/19 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
基本DOM节点操作
2017/01/17 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
python之随机数函数的实现示例
2020/12/30 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
WSDL的操作类型主要有几种
2013/07/19 面试题
优秀党员转正的自我评价
2013/10/06 职场文书
cf搞笑广告词
2014/03/14 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
村党组织公开承诺书
2015/04/30 职场文书
python内置进制转换函数的操作
2021/06/02 Python
7个关于Python的经典基础案例
2021/11/07 Python
python 管理系统实现mysql交互的示例代码
2021/12/06 Python