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的bbs设计(三)
Oct 09 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
php单链表实现代码分享
Jul 04 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 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获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
试用php中oci8扩展
2015/06/18 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
PHP中SESSION过期设置
2021/03/09 PHP
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python快速查找算法应用实例
2014/09/26 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
九年级历史教学反思
2014/01/27 职场文书
优秀小学生家长评语
2014/01/30 职场文书
大学信息公开实施方案
2014/03/09 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
市场督导岗位职责
2015/04/10 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
python自动获取微信公众号最新文章的实现代码
2022/07/15 Python