entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Solo permitir subir ciertos tipos de archivos

Tenéis alguna forma para permitir sólo subir ciertos tipos de archivos? Tengo unos botones en mi formulario de registro de nuevo informe tal que así:

<input class="normalfield" type="file" name="Upload1" id="Upload1" style="font-size:1.2em; ">

Sabéis de alguna forma de validar ese archivo sin que llegue al servidor? Sólo quiero que se permita a los usuarios subir lo típico donde puede haber información para el informe:

jpg
doc
docx
xls
xlsx
pdf
bmp
tiff
txt
msg

Alguna idea por ahí? Creo que Leonardo tenía un código pero no lo encuentro. Lo ideal sería validar en la selección del archivo de manera que si eliges uno que no aceptemos te salte un alerta y directamente vacíe el input file.

SaludoS!

P.D.: Después de postear encontré esto en google:

<input accept="file_extension|audio/*|video/*|image/*|media_type">

//Lo que hice en mi formulario fue:

<input accept="application/msexcel,application/msword,application/pdf,application/rtf,image/*" class="normalfield" type="file" name="Upload1" id="Upload1" style="font-size:1.2em; "/>

Esa solución es muy mala ya que cuando abres para subir un archivo es cierto que por defecto solo muestra lo del tipo que tu le has puesto pero si pones "todos los archivos" en el dropdown te salen todos y puedes añadir el que quieras. Parece ser que no lo envía si no es del tipo correcto pero añadirlo te deja añadirlo, lo cual genera una inconsistencia en lo que tu rellenas y lo que finalmente se envía...

3 Respuestas

1voto

ankeorum Puntos7210

Este problema lo he solucionado parcialmente del siguiente modo:

switch ($_FILES["Upload"]['type'])
{
    // Make sure the file is only a valid file type
    case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
    case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
    case "application/vnd.openxmlformats-officedocument.presentationml.presentation":

    case "application/vnd.oasis.opendocument.text":

    case "application/msword":
    case "application/pdf":
    case "application/softgrid-pdf":
    case "application/vnd.ms-excel":
    case "application/vnd.ms-excel.sheet.macroEnabled.12":
    case "image/jpeg":
    case "text/html":
    case "text/plain":
    case "message/rfc822":
    case "image/pjpeg":
    case "image/tiff":
        $allowupload = 1;
        break;
    default: 
            $allowupload = 0;   
}
if (($attachedfile == 1) && ($allowupload == 0))
{
    $result = sqlsrv_query($dbh,"UPDATE [table] SET [FileUpload]='ERROR: ".str_replace("'","",$_FILES["Upload"]["name"])."',[FileUpload7_File] ='".$newfilename."' WHERE uniquekey=".$mynewid);
    $upload_error = 1;
}

Digo parcialmente porque luego lo que hago es en el correo de validación del informe, notifico al usuario si $upload_error = 1 de que uno o más de los archivos incluidos en su transferencia no han sido incluidos, que contacte con nosotros en caso de que cree que es una incidencia. Así, bajo petición de los usuarios la lista irá proliferando.

Por favor, comentad cualquier cosa que pueda mejorar.

SaludoS!

3votos

Leonardo-Tadei Puntos227320

Hola @ankeorum,

la solución del lado del cliente es la que ponés al final de tu pergunta.

Es cierto que es mala, pero son malas todas los soluciones del lado del cliente, porque no tenés control sobre ellas (por ejemplo se podría editar el HTML de la página para sacar o cambiar restricciones).

En general, hay que poner estas cosas para facilitarle la vida al usuario, pero la validación en serio, va únicamente del lado del servidor, en dónde tenés control sobre lo que pasa.

Si recibís los archivos y los procesás con PHP por ejemplo, validás los tipos MIME o las extensiones (o ambos) o incluso interactuás con el comando file para asegurarte que el tipo MIME o la extensión no fueron cambiadas.

Toda medida de seguridad es poca: desconfiá de todas tus entradas!

0voto

ankeorum comentado

Y para hacer eso como lo hago? Voy bien por este camino?

if ($_FILES["Upload1"]["type"] == "application/msword")
{
        $allowupload = 1;
}
else
{
    $allowupload = 0;
        //Llevamos al usuario a una página de error indicándole que los ficheros subidos son erróneos.
    header('Location: /wrong_file_format.php');
}

0voto

Leonardo-Tadei comentado

Sí, vas bien por ese camino.

Tené en cuenta que según el SO, los archivos JPEG por ejemplo pueden ser del tipo:

image/jpg
image/jpeg
image/ejpg

Esto hay que irlo probando, porque lamentablemente no se sigue un standard, al extremo de cosas horibbles como las PC con MS Windows que tienen MS Office instalado y envían los archivos CSV con el tipo MIME de MS Excel... en fin.

Es bastante útil poner todos los tipos permitidos en una lista y comprar con ella, así es más fácil agregar y sacar tipos según sea necesario.

Saludos!

2votos

GusGarsaky Puntos5480

Cito al maestro Leonardo:

Toda medida de seguridad es poca

Gran frase y gran verdad. La seguridad es importantísima en el desarrollo de software ya que de nosotros depende si un software es relativamente seguro (y digo relativamente seguro porque nada es 100% seguro).

Hay gran variedad de vulnerabilidades, entre ellas LFI/RFI y vulnerabilidades Upload. Este último aplica en tu caso ya que si no sanitizas lo que el cliente sube al servidor te pueden defacear la web o lo que es peor secuestrar el server si el atacante tiene conocimientos sólidos.

Es cierto que es mala, pero son malas todas los soluciones del lado del cliente, porque no tenés control sobre ellas

Exactamente como dice Sir Leonardo. Todas las validaciones que están en el cliente es modificable/explotable fácilmente ya que el atacante tiene a disposición toda la información de esas validaciones y puede manipularlas para crear peticiones maliciosas.

Crea un script que actúe como middleware cada vez que se sube un archivo. En éste debes sanitizar los archivos que se suben, así como también analizar el payload de la petición, etc., todo lo que te ayude a mantener la seguridad en tu website y tu server.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta