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 相关文章推荐
论坛头像随机变换代码
Oct 09 PHP
如何使用PHP中的字符串函数
Nov 24 PHP
php下MYSQL limit的优化
Jan 10 PHP
PHP开发中常用的8个小技巧
Aug 27 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
Jun 08 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
ThinkPHP函数详解之M方法和R方法
Sep 10 PHP
微信支付PHP SDK之微信公众号支付代码详解
Dec 09 PHP
php文件上传、下载和删除示例
Aug 28 PHP
如何在PHP中使用数组
Jun 09 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
Windows下的PHP5.0详解
2006/11/18 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
原生JS无缝滑动轮播图
2019/10/22 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
python3实现将json对象存入Redis以及数据的导入导出
2020/07/16 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
资深财务管理人员自我评价
2013/09/22 职场文书
总裁秘书岗位职责
2013/12/04 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
中学生检讨书1000字
2014/10/28 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
2016七夕情人节感言
2015/12/09 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
浅析MongoDB之安全认证
2021/06/26 MongoDB
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏