当前位置:开发者网络 >> 技术教程 >> PHP教程 >> PHP应用 >> 内容
精彩推荐
分类最新教程
分类热点教程
  
教您如何应用PHP开发出安全的应用程序 (7)
作者:未知
日期:2005-11-18
人气:
投稿:(转贴)
来源:未知
字体:
收藏:加入浏览器收藏
以下正文:
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);?>
相关文章: