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与MySQL交互使用详解
Oct 09 PHP
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
php排序算法实例分析
Oct 17 PHP
PHP学习记录之数组函数
Jun 01 PHP
基于laravel where的高级使用方法
Oct 10 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
Python中__call__用法实例
2014/08/29 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
Python计算IV值的示例讲解
2020/02/28 Python
Python中如何添加自定义模块
2020/06/09 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
爱心捐款倡议书
2014/04/14 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
公司离职证明样本
2014/09/13 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
放飞理想主题班会
2015/08/14 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js