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 htmlentities和htmlspecialchars 的区别
Aug 18 PHP
PHP extract 将数组拆分成多个变量的函数
Jun 30 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
PHP的Json中文处理解决方案
Sep 29 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 PHP
深入分析PHP设计模式
Jun 15 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内置过滤器FILTER使用实例
2014/06/25 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
微信小程序实战之轮播图(3)
2017/04/17 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
JS常见构造模式实例对比分析
2018/08/27 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
ES6新增的数组知识实例小结
2020/05/23 Javascript
详解为什么Vue中的v-if和v-for不建议一起用
2021/01/13 Vue.js
使用PYTHON创建XML文档
2012/03/01 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
应届毕业生的自我鉴定
2013/11/13 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
档案管理员岗位职责
2015/02/12 职场文书
少年雷锋观后感
2015/06/10 职场文书
政协常委会议主持词
2015/07/03 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python