2012-11-05 61 views
1

可能重複:
Security threats with uploads安全圖片上傳PHP

我一直在尋找好的劇本/教程安全圖片上傳,但無論我發現,閱讀評論有在安全方面似乎是腳本的問題。所以我試圖編寫我的腳本。我想就此提出任何安全建議。

//create arrays from allowed extensions and types 
$allowed_exts = array("jpg", "jpeg", "png", "gif"); 
$allowed_types = array("image/jpeg", "image/png", "image/gif"); 

//extract extension from uploaded file 
$ext = strtolower(substr($_FILES["image"]["name"], strrpos($_FILES["image"]["name"], ".") + 1)); 

予先檢查是否擴展名的允許

if(in_array($ext, $allowed_exts) === false){ 
    echo "Only .jpg, .png, .gif allowed"; 
    } 

一個然後檢查如果類型是允許的

elseif(in_array($_FILES["image"]["type"], $allowed_types) === false){ 
    echo "Only .jpg, .png, .gif allowed"; 
    } 

一個然後檢查文件大小

elseif($_FILES["image"]["size"] > 2100000){ 
    echo "File is too big"; 
} 

現在使用和getimagesizeŧ Ø檢查尺寸

elseif(!getimagesize($_FILES["image"]["tmp_name"])){ 
    echo "File is not an image"; 
    } else { 

我創建一個隨機文件名

$filename = mt_rand(1000,99999)."_".$_POST['p_id'].".jpg"; 

如果這一切很好,我創建一個使用GD拇指。在短(櫃面它是一個JPEG):

a. imagecreatefromjpeg -> from uploaded file 
b. imagecreatetruecolor -> with desired thumbnail dimensions 
c. imagecopyresampled -> modify the image created under a. 
d. imagejpeg -> save image to destination 

所以,我讀過這應該消除附帶圖像的大部分問題,但我敢肯定,我錯過了一些重要的東西。

我把文件寫入的目錄有755權限,但是我想我必須通過在文件夾中放置一個.htaccess來對目錄做更多限制?那裏應該有什麼?

+2

可能重複http://stackoverflow.com/questions/11061355/security -threats-with-uploads)和[由PHP上傳的文件類型檢查](http://stackoverflow.com/questions/6755192/uploaded-file-type-check-by-php) – deceze

+0

我讀過很多這類帖子,但他們都沒有給我一個關於如何讓用戶安全上傳圖像的決定性答案。 – Juvlius

回答

0

我做了一個字符串清理腳本一會兒回來,我想這可能會有所幫助。記得清理這樣所有的$ _ POST項目:

//CLEAN-UP FUNCTIONS 
function ms($v) { 
    $v = str_replace("<br />","",$v); 
    $v = str_replace(" ","-",$v); 

    // Replace UTF-8 characters. 
    $v = str_replace(
     array("\xe2\x80\x98", "\xe2\x80\x99", "\xe2\x80\x9c", "\xe2\x80\x9d", "\xe2\x80\x93", "\xe2\x80\x94", "\xe2\x80\xa6"), 
     array("'", "'", '"', '"', '-', '--', '...'),$v); 

    // Replace their Windows-1252 equivalents. 
    $v = str_replace(
     array(chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(133)), 
     array("'", "'", '"', '"', '-', '--', '...'),$v); 
    // Finalize      
    $v = htmlspecialchars($v, ENT_QUOTES); 
    //$v = nl2br($v); 
    return $v; 
} 

用法:

$id = ms($_POST['p_id']); 
的[上傳與安全威脅(