php 判断上传文件类型和大小并尽可能降低风险

2014年06月07日 03:38 by:小屋

php处理上传文件时, 我们应该尽可能降低上传文件的风险, 比如判断文件类型和大小然后做相应的处理. 

php在上传文件的时候通常是先把上传的文件放到一个临时文件区中, Linux 临时文件保存位置的设置在 Linux服务器限制上传文件大小一文中有说明. 

上传的文件我们首先要确保它是一个上传的文件(而不是/etc/passwd之类的东西)。 没有一种已知的攻击手段允许攻击者去修改tmp_name的值。但是,没有攻击手段并不意味着你不需要做一些简单的安全措施。新的攻击手段每天在出现,而简单的一个步骤能保护你的系统。

PHP提供了两个方便的函数以减轻这些理论上的风险:is_uploaded_file( ) 和 move_uploaded_file( )。

确保tmp_name中的文件是一个上传的文件,可以用 is_uploaded_file( )

  1. <?php
  2. $filename = $_FILES['file']['tmp_name']; 
  3. if (!is_uploaded_file($filename)){ 
  4. echo "天! UFO!";
  5. }
  6. if((($_FILES["file"]["type"] != "image/gif") || ($_FILES["file"]["type"] != "image/jpeg")|| ($_FILES["file"]["type"] != "image/pjpeg"))&& ($_FILES["file"]["size"] < 20000)){
  7. echo "不是图片或图片太胖";
  8. }
  9. move_uploaded_file( $filename, "/upload/aaa.jpg" );
  10. ?>
这些安全措施的目的是加上一层额外的安全保护层。

最佳的方法是永远尽可能少地去信任。而且所有的输入都是有害的。