2010-05-01 31 views
15

Oye .. mi pregunta es cómo evitar que alguien cargue un virus o algún código malicioso con la extensión que pretende, por ejemplo, tengo un cargador de archivos PDF, cualquiera puede subir un binario con camuflaje pdf hay muchos de programas para hacer eso.Archivo de carga PHP mejorar la seguridad

Respuesta

1

Eche un vistazo a la extensión FileInfo de php.
El reconocimiento del tipo de contenido real es similar al unix file command.
Pero eso solo es útil contra usuarios maliciosos que simplemente cambian el nombre, p. virus.exe a virus.pdf. No impide la carga de un PDF dañino (utilizando algunos errores en uno o más de los lectores de PDF más extendidos).

13

Hay una serie de problemas de seguridad que surgen con la carga de archivos. El primer problema es que el archivo puede no ser el que desea, en este caso un pdf. La variable $_FILES['file_name']['type'] está controlada por el atacante puede nunca ser de confianza. Este valor se modifica comúnmente utilizando el código de explotación o el uso de tamperdata.

1) El primer paso en su sistema secuirty es asegurarse de que el archivo tiene una extensión .pdf:

if("pdf"!=substr($fileName, strrpos($fileName, '.') + 1)){ 
    die("Invalid File Type"); 
} 

2) A continuación, debe comprobar qué tipo de archivo que está utilizando la función de php filetype().

3) Un problema grave es que estos archivos PDF pueden explotar vulnerabilidades como buffer overflows que se encuentran comúnmente en el software creado por Adobe. Estos PDF se usan para propagar virus en un ataque Drive By Download.

La mejor solución es instalar el firewall de la aplicación web Mod_Security. Esto evitará que ataques como la inyección sql y xss golpeen su aplicación web. Mod_Secuirty se puede configurar para escanear todos cargar archivos para virus usando modsec-clamscan.

+0

Rook gracias por su publicación, tenía toda esa seguridad ya cubierta, excepto por el mod_security que pediré que se instale en mi hosting hostgator. Gracias amigo :) – mandril

+0

@mandril Su bienvenida, me complace ayudar – rook

+2

¿Cómo ayuda el tipo de archivo()? Me parece que todo lo que hará es decirle si el archivo es un archivo vs. directorio. Quizás te refieres a [finfo-file()] (http://www.php.net/manual/en/function.finfo-file.php)? –

1

No puede evitar que alguien cargue un virus. El mejor método es ejecutar un escaneo de virus como clamscan en todos los archivos que se cargan en su sitio.

El uso de la verificación de la extensión/verificación MIME solo le dirá que el nombre del archivo es correcto, O tiene la firma MIME correcta. No tendrá manera de saber si hay un virus o no hasta que realmente lo analice.

7

utilizamos una combinación de fileinfo + comprobación de extensión de archivo. Mientras que los navegadores normalmente envían el tipo de mimo, nunca debes confiar en él, ya que puede ser secuestrado.

En nuestro caso no ejecutamos ningún archivo en nuestro servidor. Entonces, lo que hacemos es tener un extension while list como (por ejemplo): pdf jpg png etc. y una lista de blacklisted mime extensions. De esta forma evitamos el riesgo de tener un archivo con una extensión que no coincide con el tipo mime.

una vez que el archivo se guarda en el servidor, siempre forzamos el tipo de mime a application/octet-stream, por lo que los archivos son siempre descargados.

algo como esto:

<?php 

$allowed_types = array(
/* images extensions */ 
'jpeg', 'bmp', 'png', 'gif', 'tiff', 'jpg', 
/* audio extensions */ 
'mp3', 'wav', 'midi', 'aac', 'ogg', 'wma', 'm4a', 'mid', 'orb', 'aif', 
/* movie extensions */        
'mov', 'flv', 'mpeg', 'mpg', 'mp4', 'avi', 'wmv', 'qt', 
/* document extensions */        
'txt', 'pdf', 'ppt', 'pps', 'xls', 'doc', 'xlsx', 'pptx', 'ppsx', 'docx' 
         ); 


$mime_type_black_list= array(
# HTML may contain cookie-stealing JavaScript and web bugs 
'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript', 
# PHP scripts may execute arbitrary code on the server 
'application/x-php', 'text/x-php', 'text/x-php', 
# Other types that may be interpreted by some servers 
'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh', 
'text/x-c++', 'text/x-c', 
# Windows metafile, client-side vulnerability on some systems 
# 'application/x-msmetafile', 
# A ZIP file may be a valid Java archive containing an applet which exploits the 
# same-origin policy to steal cookies  
# 'application/zip', 
         ); 


$tmp_file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); 

if(!strlen($tmp_file_extension) || (!$allow_all_types && 
    !in_array($tmp_file_extension,$allowed_types))) { 
    return false; 
} 

$finfo = new finfo(FILEINFO_MIME, MIME_MAGIC_PATH); 

if ($finfo) { 
    $mime = $finfo->file($file_name_tmp); 
} 
else { 
    $mime = $file_type; 
} 

$mime = explode(" ", $mime); 
$mime = $mime[0]; 

if (substr($mime, -1, 1) == ";") { 
    $mime = trim(substr($mime, 0, -1)); 
} 

return (in_array($mime, $mime_type_black_list) == false); 

además de esto se podría añadir virus scan usando clamav + el php extension

1

El más simple de dos pasos respuesta a allow users to securely upload files in PHP es:

  1. Guardar siempre archivos fuera de su documento raíz
  2. Writ e un script PHP para servir los archivos sin permitir que se ejecuten

Eso detendrá la mayoría de los ataques basados ​​en carga de archivos, pero no todos. Una solución más exhaustiva y completa se compone de cada uno de los siguientes:

  1. archivos que almacenan Nunca fuera de la raíz del documento, que sirven a través de un script de proxy (como el anterior).
  2. Usando finfo_file() para validar el tipo MIME del contenido real del archivo.
  3. Al cargarlo, guárdelo en un nombre de archivo aleatorio en lugar del que se proporciona, y use una fila de base de datos para conservar los metadatos (para que su secuencia de comandos proxy pueda encontrar el archivo correcto para publicar).
  4. Codifica/encripta el contenido real del archivo en el disco y hace que el script lo decodifique/descifre. Esto evita que los usuarios malintencionados carguen una carga maliciosa y luego utilicen otra vulnerabilidad (por ejemplo, LFI) para activarla. En este caso, base64_encode() debería proporcionar una protección suficiente. (Pero si usted tiene otra vulnerabilidad en su aplicación, debe realmente arreglar eso.)

Si haces todo lo anterior, el formulario de carga no es probable que alguna vez ser una fuente de vulnerabilidad.

+0

Este es el primer lugar que he leído sobre su punto número 4 que se está utilizando con la carga de archivos. En ningún otro lugar visto. + 1.Y por qué es tanto lo que se escribe con puntos de vista conflictivos, aquí y php.net por el amor de ... no hagas eso. no hagas esto Me gusta tu publicación. – Joeme