2013-08-07 76 views
2
$filename=$_FILES['file']['name']; 
$type=$_FILES['file']['type']; 
$extension=strtolower(substr($filename, strpos($filename, '.')+1)); 
$size=$_FILES['file']['size']; 


if(($extension=='jpg' || $extension=='jpeg') && ($type!='image/jpg' || $type!='image/jpeg')){... 

我有一个输入文件,可以让用户只上传jpg/jpeg图片,我有检查类型,扩展名,大小。PHP文件图片上传安全

  1. 但是我不知道如何检查,如果用户改变扩展(例如abc.php - > abc.jpg的)。

  2. 任何别的东西,我需要检查之前,我保存用户的图像到我的服务器?

+0

可能重复(http://stackoverflow.com/questions/11061355/security-threats-with-uploads) – deceze

+0

@deceze这是一个更具体的图像。有许多PHP函数对于这个问题是独一无二的,即exif_imagetype()和imagejpeg(),它们应该是唯一有利于这种情况的。 – XaxD

+0

thx求救,我想我会用所有的函数来检查,万一发生什么事,看起来好像还有更多文章需要阅读... – Ben

回答

2

我会建议使用FINFO:从PHP文件的网站采取

<?php 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
    foreach (glob("*") as $filename) { 
     echo finfo_file($finfo, $filename) . "\n"; 
    } 
    finfo_close($finfo); 

    /* outputs: 
    text/html 
    image/gif 
    application/vnd.ms-excel 
    */ 
?> 

例子。 查看更多关于php文档页面的信息http://www.php.net/manual/en/function.finfo-file.php

+0

这是从文件本身以某种方式读取MIME类型,还是从用户的内容类型标题? – Katana314

+0

@ Katana314是的,从文件中特定位置的字节序列请检查http://www.php.net/manual/en/intro.fileinfo.php:D及其要求:http://www.php.net /manual/en/book.fileinfo.php –

0

@Fabian的答案看起来不错,用于检查文件的类型。虽然我会建议采用不同的方法来获取文件的扩展名。

考虑一个名为stack.overflow.jpg的文件。

$filename = 'stack.overflow.jpg'; 

// With your code $extension = 'overflow.jpg' 
$extension=strtolower(substr($filename, strpos($filename, '.') +1)); 

// With pathinfo() $extension = 'jpg' 
$extension = pathinfo($filename, PATHINFO_EXTENSION); 

考虑使用pathinfo()来获取文件扩展名:http://www.php.net/manual/en/function.pathinfo.php

的[上传与安全威胁]
+0

文件扩展意味着什么,但。我可以命名我的恶意脚本keyloggervirus.exe.jpg,它仍然会执行。您需要使用PHP来实际验证图片内容,就像上面的答案一样。 – XaxD

+0

是否有任何方式将文件重新格式化为JPG格式?所以即使它的恶意脚本,它也会变成jpg – Ben

+0

php有'imagejpeg()' – XaxD