es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Verificar la extensión de un archivo es suficiente para saber que el archivo no está ocultando un virus (o algo que pueda infiltrarse en mi servidor)?

Estoy desarrollando un sistema en el que el usuario podrá subir un archivo “.docx”. ¿Verificar su extensión es suficiente para saber que este archivo “.docx” no está infectado?

Aquí está mi código PHP de carga:

<?php
session_start();

include("connection.php");
include("functions.php");

// Solo para validar al usuario
$datosUsuario = checklogin($con);

include("connectionPostsDB.php");

if (isset($_POST['submit'])){

    $titulo = $_POST['title'];
    $etiqueta = $_POST['tag'];
    $descripcion = $_POST['description'];

    $archivo = $_FILES['file'];

    $nombreArchivo = $_FILES['file']['name'];
    $nombreArchivoTmp = $_FILES['file']['tmp_name'];
    $tamanoArchivo = $_FILES['file']['size'];
    $errorArchivo = $_FILES['file']['error'];
    $tipoArchivo = $_FILES['file']['type'];

    $extArchivo = explode('.', $nombreArchivo);
    $extActualArchivo = strtolower(end($extArchivo)); // aquí obtengo la extensión actual del archivo (espero xD)

    $permitidos = array('docx');

    if(in_array($extActualArchivo, $permitidos)){
        if($errorArchivo === 0){
            if($tamanoArchivo < 1000000){
                $nombreArchivoNuevo = uniqid('', true).".".$extActualArchivo;
                $destinoArchivo = '../imgs/posts/'.$nombreArchivoNuevo;
                move_uploaded_file($nombreArchivoTmp, $destinoArchivo);

                $consulta = "INSERT INTO posts (titulo, descripcion, nombreimg, etiqueta) 
                            VALUES ('".$titulo."','".$descripcion."','".$nombreArchivoNuevo."','".$etiqueta."')";

                mysqli_query($postcon, $consulta);

                echo 'Archivo cargado correctamente';
            }
            else {
                echo 'Tu archivo es demasiado grande.';
            }
        }
        else {
            echo 'Hubo un error al cargar tu archivo.';
        }
    }
    else {
        echo 'No se permite este tipo de archivo.';
    }

}

Entonces, ¿verificar la extensión del archivo es suficiente para evitar que algún usuario inserte código PHP en mi servidor (o haga algo para obtener información del servidor)?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Verificar la extensión de un archivo no siempre es suficiente para saber si está infectado o no. Los atacantes pueden cambiar el nombre de la extensión del archivo a algo permitido, como “.docx”, y aún así inyectar código malicioso en el archivo. También pueden utilizar archivos especialmente creados para evadir las comprobaciones basadas en las extensiones de archivo.

    Para asegurar una mejor seguridad, se debe utilizar un método más robusto para detectar virus o código malicioso en los archivos subidos. Algunas opciones incluyen:

    1. Utilizar un software antivirus para escanear los archivos antes/después de la carga.
    2. Verificar el tipo de archivo leyendo el número mágico (primeros bytes) del archivo en lugar de confiar en la extensión.
    3. Implementar validación en el servidor utilizando herramientas como el verificador de archivos de código abierto ClamAV.
    4. Permitir solo tipos de archivos específicos que se sabe que son seguros y agregarlos a una lista blanca en el lado del servidor.

    Se puede utilizar una combinación de estos métodos para asegurar una mejor protección para su sistema.

Comments are closed.