专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » php安全:PHP的7大安全错误 »正文

php安全:PHP的7大安全错误

来源: 发布时间:星期三, 2008年9月10日 浏览:135次 评论:0
为了适应动态网站的迅速发展,PHP是一个极好的语言选择。对初学者它有很多友好的特性,例如不需要声明变量类型。同时,这些特性也会使开发者无意之中在程序里留下安全漏洞。一些流行的安全相关的邮件列表描述了很多php应用程序的漏洞,但是只要明白了容易犯的基本安全错误,PHP可以像其他任何语言一样安全。
再这篇文章里,我会详细的阐述一些经常导致安全漏洞的php编程错误。在告诉你不该做什么和每一个漏洞是怎么产生的时候,我希望你不仅能理解怎样去避免这些错误,而且也能明白为什么会产生这些安全漏洞。明白了每一个潜在的安全漏洞会帮助你避免再犯同样的错误。
安全措施是一个过程,不是一个产物。在开发过程中采用一个好的安全处理方法会让你写出更严谨和健壮的代码。
未经验证的输入PHP中最常见的安全隐患之一是没有经过验证的输入错误。用户提供的数据通常是不能信任的,所以应当假设每一个web访问者怀有恶意—事实上他们当中确实有一些是这样的。没有经过验证或者验证不当的输入是其他许多溢出错误的根源。
举一个例子,你可能会用下面的代码调用UNIX的cal命令实现月历功能
$month=$_GET[’month’];
$year=$_GET[’year’];

exec(\"cal$month$year\",$result);
print\"<PRE>\";
foreach($resultas$r){print\"$r<BR>\";}
print\"</PRE>\";
这段代码由一个很大的漏洞,$_GET[month]和$_GET[year]变量没有经过任何验证。只要输入的月份是介于1和12之间的数字并且年份是一个4位数字,这段代码运行良好。但是,恶意的用户只要在年份的后面加上’;ls-la’就会列出整个网站的Web目录。同样另一个相当危险的漏洞,’;rm-rf’的后缀会删除所有的网页。
正确的处理方法是确保你得到的数据是你预期的。不要用Javascrīpt来验证,恶意用户会创建自己的表单来禁用javascrīpt,因此会很容易的绕过验证。正如下面列出的,你必须用php代码确保月份和年份的输入是数字,并且只能是数字。
$month=$_GET[’month’];
$year=$_GET[’year’];

if(!preg_match(\"/^[0-9]{1,2}$/\",$month))die(\"Badmonth,pleasere-enter.\");
if(!preg_match(\"/^[0-9]{4}$/\",$year))die(\"Badyear,pleasere-enter.\");

exec(\"cal$month$year\",$result);
print\"<PRE>\";
foreach($resultas$r){print\"$r<BR>\";}
print\"</PRE>\";
这些代码可以安全的使用,并且不用担心用户的输入是否会危及到应用程序和服务器的安全。正则表达式是检验输入的很好的工具,虽然他们不容易掌握,但在这方面确实非常有用。
你应当在验证用户数据时把所有非预期的数据剔除掉,而不是仅仅剔除有危害的数据—这是经常见的安全漏洞原因。有时,恶意用户会绕过这些常用的验证方法,例如输入一些带有NULL的非法数据。这些做法通常会绕过检验,但仍然会对安全产生威胁。 [Page]
你应当尽可能严格的检验输入的数据。如果有些字符不会被用到,那么就应该剔除掉或者拒绝此次的全部输入。
权限控制漏洞另一种易受安全威胁的就是权限控制,虽然并非只针对php,但仍然是不容忽视的。这种隐患通常存在于针对特定用户的应用程序,例如后台管理这样可以修改配置或者显示敏感数据的地方。
你应当在每一个针对特定用户的页面检查用户的权限级别。如果只在首页检查,那么一个恶意用户就可以直接在地址栏里输入通过检查之后调用的页面,这样就可以跳过身份验证。
对安全分级是非常明智的,如果你的用户IP是固定的或者在特定范围之内,那么就可以根据用户的IP和用户名对权限做出控制。把特定的页面放在特定的目录,并用apache的.htaccess保护起来,是非常好的做法。
把保存配置的文件放在Web目录之外。一个配置文件可以保存数据库密码或者其他可以让恶意用户入侵或修改网站的重要信息;绝对不要让这些文件可以被远程用户访问到。用php的include函数包含web目录之外的文件,这些目录里也要放一个含有’denyfromall’的.htaccess文件,防止管理员的疏忽而让这些目录称为web目录。虽然这显得有些多余,但对于安全仍然是一个积极的做法。
在我做的php程序当中,我比较喜欢下面列出的目录结构。所有的函数库,类文件和配置文件都放在include目录里。这些文件都要以.php结尾,目的就是在保护措施失效的情况下,Web服务器会对这些文件解析,而不是直接显示出内容。www和admin目录是唯一两个可以通过URL直接访问的目录;admin目录通过.htaccess保护,只允许知道用户名和密码的用户进入,这些用户名和密码都保存在根目录的.htpasswd文件中。
/home
/httpd
/www.example.com
.htpasswd
/includes
cart.class.php
config.php
/logs
access_log
error_log
/www
index.php
/admin
.htaccess
index.php
你应当设置Apache的索引文件为index.php,并且在每一个目录里都放置一个index.php文件。那些不可以浏览目录里的index.php文件都应当指向你的主页,例如放置图片的目录的index.php等。

如果本文没有解决您的问题,请进老妖怪开发者社区提问

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: