PHP中通过语义URL防止网站被攻击的方法分享
2015-01-24信息快讯网
好奇心是很多攻击者的主要动机,语义URL 攻击就是一个很好的例子。此类攻击主要包括对URL 进行编辑以期发现一些有趣的事情。
什么是语义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 帐号的合法拥有者。如果他提供了[email protected] 作为备用邮件地址,在提交后他将进入下面的URL:
http://example.org/reset.php?user=chris&email=chris%40example.org
该URL 出现在浏览器栏中,所以任何一位进行到这一步的用户都能够方便地看出其中的user和mail 变量的作用。当意思到这一点后,这位用户就想到[email protected] 是一个非常酷的地址,于是他就会访问下面链接进行尝试:
http://example.org/reset.php?user=php&email=chris%40example.org
如果reset.php 信任了用户提供的这些信息,这就是一个语义URL 攻击漏洞。在此情况下,系统将会为php 帐号产生一个新密码并发送至[email protected],这样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权限分配的实现代码
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
phpcms模块开发之swfupload的使用介绍
php中get_headers函数的作用及用法的详细介绍
使用php get_headers 判断URL是否有效的解决办法
PHP中使用cURL实现Get和Post请求的方法
PHP下使用CURL方式POST数据至API接口的代码
PHP中CURL方法curl_setopt()函数的参数分享
php curl 伪造IP来源的实例代码
php cc攻击代码与防范方法
细谈php中SQL注入攻击与XSS攻击
php DOS攻击实现代码(附如何防范)
PHP代码网站如何防范SQL注入漏洞攻击建议分享
PHP中全面阻止SQL注入式攻击分析小结
判断PHP数组是否为空的代码
PHP session会话的安全性分析
php中实现简单的ACL 完结篇
php将时间差转换为字符串提示
php 中英文语言转换类
php继承的一个应用
PHP url 加密解密函数代码
php中使用Curl、socket、file_get_contents三种方法POST提交数据
php的urlencode()URL编码函数浅析
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
PHP获取url的函数代码
PHP+SQL 注入攻击的技术实现以及预防办法
PHP+SQL 注入攻击的技术实现以及预防办法
php防攻击代码升级版
IP攻击升级,程序改进以对付新的攻击
php下网站防IP攻击代码,超级实用