PHP中通过语义URL防止网站被攻击的方法分享


Posted in PHP onSeptember 08, 2011

什么是语义URL 攻击?

好奇心是很多攻击者的主要动机,语义URL 攻击就是一个很好的例子。此类攻击主要包括对URL 进行编辑以期发现一些有趣的事情。

例如,如果用户chris 点击了你的软件中的一个链接并到达了页面http://example.org/private.php?user=chris, 很自然地他可能会试图改变user的值,看看会发生什么。例如,他可能访问http://example.org/private.php?user=rasmus 来看一下他是否能看到其他人的信息。虽然对GET 数据的操纵只是比对POST 数据稍为方便,但它的暴露性决定了它更为频繁的受攻击,特别是对于攻击的新手而言。

大多数的漏洞是由于疏漏而产生的,而不是特别复杂的原因引起的。虽然很多有经验的程序员能轻易地意识到上面所述的对URL 的信任所带来的危险,但是常常要到别人指出才恍然大悟。

为了更好地演示语义URL 攻击及漏洞是如何被疏忽的,以一个Webmail 系统为例,该系统主要功能是用户登录察看他们自己的邮件。

任何基于用户登录的系统都需要一个密码找回机制。通常的方法是询问一个攻击者不可能知道的问题(如你的计算机的品牌等,但如果能让用户自己指定问题和答案更佳),如果问题回答正确,则把新的密码发送到注册时指定的邮件地址。

对于一个Webmail 系统,可能不会在注册时指定邮件地址,因此正确回答问题的用户会被提示提供一个邮件地址(在向该邮件地址发送新密码的同时,也可以收集备用邮件地址信息)。下面的表单即用于询问一个新的邮件地址,同时他的帐户名称存在表单的一个隐藏字段中:

<input type="hidden" name="user" value="chris" /> 
<p>Please specify the email address where you want your new password sent: <input type="text" name="email" /> 
<input type="submit" value="Send Password" /> 
</form>

可以看出,接收脚本reset.php 会得到所有信息,包括重置哪个帐号的密码、并给出将新密码发送到哪一个邮件地址。

如果一个用户能看到上面的表单(在回答正确问题后),你有理由认为他是chris 帐号的合法拥有者。如果他提供了chris@example.org 作为备用邮件地址,在提交后他将进入下面的URL:

http://example.org/reset.php?user=chris&email=chris%40example.org

该URL 出现在浏览器栏中,所以任何一位进行到这一步的用户都能够方便地看出其中的user和mail 变量的作用。当意思到这一点后,这位用户就想到php@example.org 是一个非常酷的地址,于是他就会访问下面链接进行尝试:

http://example.org/reset.php?user=php&email=chris%40example.org

如果reset.php 信任了用户提供的这些信息,这就是一个语义URL 攻击漏洞。在此情况下,系统将会为php 帐号产生一个新密码并发送至chris@example.org,这样chris 成功地窃取了php 帐号。

如果使用session 跟踪,可以很方便地避免上述情况的发生:

<?php 
session_start(); 
$clean = array(); 
$email_pattern = '/^[^@\s<&>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i'; 
if (preg_match($email_pattern, $_POST['email'])) 
{ 
$clean['email'] = $_POST['email']; 
$user = $_SESSION['user']; 
$new_password = md5(uniqid(rand(), TRUE)); 
if ($_SESSION['verified']) 
{ 
/* Update Password */ 
mail($clean['email'], 'Your New Password', $new_password); 
} 
} 
?>

尽管上例省略了一些细节(如更详细的email 信息或一个合理的密码),但它示范了对用户提供的帐户不加以信任,同时更重要的是使用session 变量为保存用户是否正确回答了问题($_SESSION['verified']),以及正确回答问题的用户($_SESSION['user'])。正是这种不信任的做法是防止你的应用产生漏洞的关键。

其实,只要记住以下的原则就行了!

不要相信任何用户的输入(也就是对用户的输入做检测,虽然,写起来比较麻烦,但总比出了问题在解决要来的及时吧!)

PHP 相关文章推荐
新手学PHP之数据库操作详解及乱码解决!
Jan 02 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
PHP实现返回JSON和XML的类分享
Jan 28 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PDO::setAttribute讲解
Jan 29 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 PHP
PHP session会话的安全性分析
Sep 08 #PHP
php中实现简单的ACL 完结篇
Sep 07 #PHP
php将时间差转换为字符串提示
Sep 07 #PHP
php 中英文语言转换类
Sep 07 #PHP
php继承的一个应用
Sep 06 #PHP
php 抽象类的简单应用
Sep 06 #PHP
PHP中PDO基础教程 入门级
Sep 04 #PHP
You might like
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
Jquery EasyUI $.Parser
2017/06/02 jQuery
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
Python and、or以及and-or语法总结
2015/04/14 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
单位办理社保介绍信
2014/01/10 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
2015元旦节寄语
2014/12/08 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
个人道歉信大全
2019/04/11 职场文书
德劲DE1108畅想
2021/04/22 无线电