2012-02-16 1226 views
6

Tengo un script de carga PHP simple que he comenzado. No soy el mejor para PHP. Solo buscando algunas sugerencias.PHP Subir archivos: comprobación de solo imagen

quiero limitar mi guión a solamente .jpg, .jpeg, .gif y .png

Es esto posible?

<?php 
/* 
    Temp Uploader 
*/ 

    # vars 
    $mx=rand(); 
    $advid=$_REQUEST["advid"]; 
    $hash=md5(rand); 

    # create our temp dir 
    mkdir("./uploads/tempads/".$advid."/".$mx."/".$hash."/", 0777, true); 

    # upload dir 
    $uploaddir = './uploads/tempads/'.$advid.'/'.$mx.'/'.$hash.'/'; 
    $file = $uploaddir . basename($_FILES['file']['name']); 

    // I was thinking of a large IF STATEMENT HERE .. 

    # upload the file 
    if (move_uploaded_file($_FILES['file']['tmp_name'], $file)) { 
     $result = 1; 
    } else { 
     $result = 0; 
    } 

    sleep(10); 
    echo $result; 

?> 
+0

http://cowburn.info/2008/01/13/get-file- extension-comparison/- aparentemente strrchr es la forma más rápida – TheBlackBenzKid

Respuesta

39

Sí, con bastante facilidad. Pero en primer lugar, es necesario algunos bits adicionales:

// never assume the upload succeeded 
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) { 
    die("Upload failed with error code " . $_FILES['file']['error']); 
} 

$info = getimagesize($_FILES['file']['tmp_name']); 
if ($info === FALSE) { 
    die("Unable to determine image type of uploaded file"); 
} 

if (($info[2] !== IMAGETYPE_GIF) && ($info[2] !== IMAGETYPE_JPEG) && ($info[2] !== IMAGETYPE_PNG)) { 
    die("Not a gif/jpeg/png"); 
} 

docs pertinentes here y here y here

+1

Muéstremelo: este método se asegura de que el archivo * sea * una imagen, no solo * con el nombre * de una imagen. –

+0

Gran respuesta. Esta es una forma práctica de hacer el trabajo. –

+1

La única advertencia es que GD no es útil para PHP y puede ser complicado. finfo_file es estándar en PHP después de la versión 5.3.0 y también realizará una verificación basada en el contenido. –

-2
if (substr($_FILES["fieldName"]["name"], strlen($_FILES["fieldName"]["name"])-4) == ".jpg") 
    { 
    if(move_uploaded_file($_FILES["fieldName"]["tmp_name"],$path."/".$_FILES['fieldName']['name'])) 

{ 

echo "image sucessfully uploaded!"; 

     } 
} 

mismo modo se puede comprobar si hay otros formatos de imagen también.

+0

por favor reformatea tu respuesta ;-) –

+1

Estás asumiendo que el usuario remoto no es malicioso y no solo cambiará el nombre 'nastyvirus.exe' a' cutekittens.jpg'. –

5

Ruta de archivos no es necesariamente la mejor manera de comprobar si una imagen es en realidad una imagen. Podría tomar un archivo javascript malicioso, renombrarlo para tener la extensión .jpg y subirlo. Ahora, cuando intenta mostrarlo en su sitio web, es posible que haya comprometido su sitio.

Aquí es una función para validar lo que realmente es una imagen:

<?php 
    function isImage($img){ 
     return (bool)getimagesize($img); 
    } 
?> 
+3

'No use getimagesize() para verificar que un archivo dado sea una imagen válida. Utilice una solución especialmente diseñada, como la extensión Fileinfo en su lugar. - [Docs] (http://php.net/getimagesize) –

0

intente esto:

<?php 

function isimage(){ 
$type=$_FILES['my-image']['type'];  

$extensions=array('image/jpg','image/jpe','image/jpeg','image/jfif','image/png','image/bmp','image/dib','image/gif'); 
    if(in_array($type, $extensions)){ 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

    if(isimage()){ 
     //do codes.. 
    } 

?> 
+0

Su publicación se marcó como de baja calidad porque era todo código. Intenta explicar lo que hiciste –

Cuestiones relacionadas