博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

剑心通明的资料库

文章均为转载,本人不负因参考它所导致的一切后果,请谨慎参考!如您的文章不愿被转载,请点击此处联系本人!
  jxtm.cublog.cn

关于作者
姓名:剑心通明
职业:高级工程师(专修灵魂^_^)
年龄:20出头30不到
位置:网络上一节点
个性介绍:努力学习每一天!
倾心打造:http://www.bsdlover.cn
http://bbs.bsdlover.cn
BSD爱好者的乐园!
|| << >> ||
我的分类


教您如何应用PHP开发出安全的应用程序--之六

6、创建安全的PHP脚本

有很多编程技巧使PHP脚本更安全地运行。其中最重要的一条是使用一些安全常识。运行PHP比运行CGI脚本更安全,但它仍然有许多出现错误的地方。转换到安全运行模式能够限制出错所产生的结果。如果你的PHP脚本中有错误,可能会被人找到并且利用它来破坏站点甚至数据库。所以经常备份也是必要的。

(1)安全设置软件

基于Web的应用程序,如在线目录,通常都在无人密切监视的情况下运行。如果发生错误时,你不可能立即采取行动。通常访问者最先注意到所发生的问题,你应该使他们很容易地报告所发生的问题。更进一步,可以由构成这个网站的脚本来跟踪这些问题。例如,你的访问者可能做一些你想不到的事情。也可能你对于重要函数所返回值没有检查,脚本可能会以不可预料的方式运行。

写出更加安全的程序,就可以避免这些问题。例如你应该检查数据库函数的返回值,如果数据库崩溃,显示给用户的应该是出错的信息页面而不是满屏幕的错误。你甚至可以让脚本在发生严重问题,如数据库崩溃、硬盘空间已满的时候自动通知你。你也应该检查从用户传来的所有数据。显然后者更重要。 如果你的程序能够应付各种错误,那么你的程序不仅更加可靠,而且可以花更少的时间来维护。这些时间可大大弥补你开发程序时所花的额外时间。

(2)合理存储和交换敏感信息

显然,你应尽量避免在互联网上以GET、POST、cookie或URL编码的形式传递敏感信息,这样使信息很容易被窃取。使用支持SSL的web服务器能够做到这一点,因为它加密站点和访问者浏览器之间所有的信息流。

如果你没有支持SSL的Web服务器,那么你需要其他的办法。比如没有必要总是发送数据到浏览器;把数据保存在数据库中,只向浏览器发送关键字,这样也很容易查找到所需要的数据;并以加密的形式发送所有的数据等等。实现这种功能的最简单的办法是使用Session。PHP4支持本地化的Session功能,PHP3则要使用PHPMB库。

HTTP 协议是一种无状态协议,它不负责为好连接的状态信息,因此无法跟踪客户端的各种信息,Session的出现改变这一状况。当用户浏览一个支持Session功能的CGI脚本时,在他离开这个网页前可以将用户信息保存在同意Session ID之下,也就是可以在不同的网页之间偕同存取用户信息。

如果不使用PHP的安全模式或在suEXEC下以CGI方式运行PHP,那么监视你的文件的内容就不可能实现。此时唯一防止别人读取数据的方法是尽快把数据保存到数据库中。

(3)检查用户输入

Per1语言有个特性叫污点检测(taint checking)。当污点检测生效时,即使没有发生重大错误,你也不能运行含有可疑变量的函数。一个变量,当它的值是用户提供数据的一部分或全部时就变成可疑的了,因为这些数据被认为是不安全的。这样可提高系统安性。

PHP没有这个特性,但PHP有escapeshellcmd函数,可以达到同样的效果。另一个不让用户滥用脚本的方法是只允许使用经过严格检查的输入。例如如果需要输入IP地址时,应当检查这个IP地址十分有效。使用正则表达式可以做到这一点。下面这个函数例子将验证一个字符串这是否包含有效的IP地址。

function validate_ip($ip) 
{
if (is_string($ip) && ereg
(,^([0-9]{1,3})\.
( [0-9]{l,3})\. ''([0-9]{1,3})\
.([0-9]{1,3})$',$ip, $part)) 
{if ($part[l] <= 255 && $part[2]
<= 255 &&$part[3] <= 255
&& $part[4] <= 255)return TRUE;
# Valid IP  }return FALSE;
# Invalid IP}


许多PHP程序的安全缺陷不是程序语言本身,而是没有在编码中考虑到用户提交数据的安全。所以对于用户提交数据,应当小心检查代码以确保任何由web浏览器提交的变量经过了相应的检查。下面是一个危险的变量使用:

<?php
//从某个用户目录下删除文件... 
可能是其他用户的文件?unlink ($evil_var);
// 记下访问日志... 也许没有必要
?fputs ($fp, $evil_var);?>

发表于: 2008-05-17,修改于: 2008-05-17 11:01,已浏览71次,有评论0条 推荐 投诉


网友评论
 发表评论