解决方法一:
如果系统中只是跟数据库进行交互,那么完全可以屏蔽掉这些文件存取函数,象fopen、file、file_get_contents、readfile、opendir等函数,方法就是在php的配置文件php.ini中进行禁止,php.ini中有一个选项叫做disable_functions,我们可以把需要屏蔽的函数放到里面:
disable_functions = highlight_file,fopen,file,file_get_contents,readfile,opendir
那么上面那些函数就无法使用了,比如你调用了highlight_file函数,那么php引擎会提示你:
Warning: highlight_file() has been disabled for security reasons in /home/heiyeluren/public_html/test.php on line 5
当然,我们不能一概而杀,只是说你可以禁止掉那些基本不怎么使用的函数,比如highlight_file我觉得就使用的比较少。
解决方法二:
第一种方法太强制性了,函数禁止后将无法访问该函数,总是不是那么的适合,对于一些空间提供商来讲,是不合理的,那么还有一个解决方法,还是配置我们的php.ini,打开php的安全模式:
safe_mode = On
当然,如果你需要,最好再配置一下open_basedir之类的选项来更好的控制,具体可参考php手册。
当我们打开了php的安全模式后,我们再来访问一下/etc/passwd,提交URL:
http://192.168.0.1/~heiyeluren/test.php?f=/etc/passwd
那么浏览器中马上就显示:
Warning: highlight_file() [function.highlight-file]: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /home/heiyeluren/public_html/test.php on line 5
我们设置设置一下不是随便能够读的:
[~]# chmod 640 /usr/local/php/lib/php.ini
[~]# ls -al /usr/local/php/lib/php.ini
-rw-r----- 1 root root 1865 Nov 27 01:16 /usr/local/php/lib/php.ini
现在,我们在访问http://192.168.0.1/~heiyeluren/test.php?f=/usr/local/php/lib/php.ini 看看:
Warning: highlight_file(/usr/local/php/lib/php.ini) [function.highlight-file]: failed to open stream: Permission denied in /home/heiyeluren/public_html/test.php on line 5
Warning: highlight_file() [function.highlight-file]: Failed opening '/usr/local/php/lib/php.ini' for highlighting in /home/heiyeluren/public_html/test.php on line 5
警告说没有权限读取/usr/local/php/lib/php.ini这个文件,顺利达到我们的目的。