正 文

安全配置你的PHP


www.7dspace.com  更新日期:2005-8-16 3:26:04  七度空间


5、文件上传

  php的文件上传机制是把用户上传的文件保存在php.ini的upload_tmp_dir定义的临时目录(默认是系统的临时目录,如:/tmp)里的一个类似phpxXuoXG的随机临时文件,程序执行结束,该临时文件也被删除。PHP给上传的文件定义了四个变量:(如form变量名是file,而且register_globals打开)

  $file #就是保存到服务器端的临时文件(如/tmp/phpxXuoXG )

  $file_size #上传文件的大小

  $file_name #上传文件的原始名称

  $file_type #上传文件的类型

  推荐使用:

  $HTTP_POST_FILES['file']['tmp_name']

  $HTTP_POST_FILES['file']['size']

  $HTTP_POST_FILES['file']['name']

  $HTTP_POST_FILES['file']['type']

  这是一个最简单的文件上传代码:

  
  //test_5.php

  if(isset($upload) && $file != "none") {

   copy($file, "/usr/local/apache/htdocs/upload/".$file_name);

   echo "文件".$file_name."上传成功!点击继续上传";

   exit;

  }

  ?>

   content="text/html; charset=gb2312">

  上传文件:

  

  
  

  这样的上传代码存在读取任意文件和执行命令的重大问题。

  下面的请求可以把/etc/passwd文档拷贝到web目录/usr/local/apache/htdocs/test(注意:这个目录必须nobody可写)下的attack.txt文件里:

  http://victim/test_5.php?upload=1&file=/etc/passwd&file_name=attack.txt

  然后可以用如下请求读取口令文件:

  http://victim/test/attack.txt

  攻击者可以把php文件拷贝成其它扩展名,泄漏脚本源代码。

  攻击者可以自定义form里file_name变量的值,上传覆盖任意有写权限的文件。

  攻击者还可以上传PHP脚本执行主机的命令。

  解决方法:

  PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函数,可以检查操作的文件是否是用户上传的文件,从而避免把系统文件拷贝到web目录。

  使用$HTTP_POST_FILES数组来读取用户上传的文件变量。

  严格检查上传变量。比如不允许是php脚本文件。

  把PHP脚本操作限制在web目录可以避免程序员使用copy函数把系统文件拷贝到web目录。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。

  把PHP脚本用phpencode进行加密,避免由于copy操作泄漏源码。

  严格配置文件和目录的权限,只允许上传的目录能够让nobody用户可写。

  对于上传目录去掉PHP解释功能,可以通过修改httpd.conf实现:

  (未完)
4页,当前在第3页  1  2  3  4  

上一篇:PHP开发中文件操作疑难问答
下一篇:如何正确理解PHP的错误信息
作者:  来源: ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐