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程序
Oct 09 PHP
用PHP+MySql编写聊天室
Oct 09 PHP
php adodb操作mysql数据库
Mar 19 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
PHP中常用的输出函数总结
Sep 22 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
PHP实现将textarea的值根据回车换行拆分至数组
Jun 10 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
Centos7安装swoole扩展操作示例
Mar 26 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的FTP学习(一)
2006/10/09 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
微信营销策划方案
2014/02/24 职场文书
2014年财政局工作总结
2014/12/09 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP