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