Validar si un archivo subo el md5 esta repetido en otro archivo subido (DB)

Iniciado por Drakaris, 11 Noviembre 2018, 11:49 AM

0 Miembros y 1 Visitante están viendo este tema.

Drakaris

estoy haciendo subida de archivos en PHP ($_FILES), y antes de que me lo suba al servidor, quisiera que me compruebe si el archivo es una copia, por la cual hice lo que hice es que al insertar los datos se me cree un codigo md5 que sera el documento y sera unico en cada documento, imagen, video, y audio, ya que lo que hace es leer el archivo con file_get_contents() y después le crea un md5, hasta ahí bien pero, lo que quiera es que después del upload, me haga un filtro con if, que si el md5, con la hora actual, que acabo de subir es igual a otro md5 que se ha subido, significa que es el mismo archivo (con snombre diferente), y me elimina el archivo con la hora mas reciente.

Lo que no acabo de saber es como hacer este if, por ahora he hecho esto:

Código (php) [Seleccionar]

               $conexion = new mysqli("privado","privado","privado","privado");
               if (!$conexion) {
                   die("Error al conectar con la DB: ".$conexion->connect_error);
               }
               $ruta = $_SERVER['DOCUMENT_ROOT']."/plugins/mensajeria/archivos/chat_do/videos";
               $url = $ruta."/".$_FILES['archivo']['name'];
               move_uploaded_file($_FILES['archivo']['tmp_name'],$url);
               date_default_timezone_set('Europe/Madrid');
               $fecha = date("d/m/Y");
               $hora = date("G:i");
               $mensaje = $_POST['mensaje_text'];
               mysqli_real_escape_string($conexion,$mensaje);
               $name_file = $_FILES['archivo']['name'];
               $size_file = $_FILES['archivo']['size'];
               $type_file = $_FILES['archivo']['type'];
               $url1 = file_get_contents($url);
               $md5 = md5($url1);
               $enlace = $_SERVER['SERVER_NAME']."/plugins/mensajeria/archivos/chat_do/videos/".$_FILES['archivo']['name'];
               $insertar = "INSERT INTO chat_do (md5,Clase,Mensaje,Multimedia,NombreArchivo,TamanoArchivo,TipoArchivo,Fecha,Hora) VALUES ('".$md5."','1A','".$mensaje."','".$enlace."','".$name_file."','".$size_file."','".$type_file."','".$fecha."','".$hora."')";
               $mostrar = "SELECT md5 FROM chat_do WHERE Fecha != '".$hora."'";
               $result = $conexion->query($mostrar);
               $row = $result->fetch_assoc();
               if ($md5 != $mostrar) {
                   if ($conexion->query($insertar) === TRUE) {
                       echo "1 video";
                   }else{
                       echo "error video";
                   }  
               }else{
                   unlink($url);
                   echo "archivo_copiado";
               }


El problema es que no se porque no funciona, creo que es $md5 != $mostrar, lo que esta mal. No se. Lo que quisiera hacer es que me diga si el $md5 es igual al primer dato de la DB md5, sino al segundo, al tercero... así consecutivamente hasta que consida con uno y me salte el else. La caso es que tiene que ser automático, no puedo hacerlo manualmente, sino no funcionará.

Código (php) [Seleccionar]

               if ($md5 != $mostrar) {
                   if ($conexion->query($insertar) === TRUE) {
                       echo "1 video";
                   }else{
                       echo "error video";
                   }  
               }else{
                   unlink($url);
                   echo "archivo_copiado";
               }


Gracias de antemano
Lo increible, no es lo que ves, sino como es

#!drvy

Efectivamente, es ese if el que te falla, porque no tiene ningún sentido  :silbar:

Imaginemos que vamos a subir un archivo cuyo MD5 computado es:
586ef60b2a08f960b6716a899b2c8a2c

Segun ese if, la comparación sería así:
Código (php) [Seleccionar]

if ('586ef60b2a08f960b6716a899b2c8a2c' != "SELECT md5 FROM chat_do WHERE Fecha != '9:40'")


Es decir, estas comparando un MD5 con una consulta SQL. Por otro lado, cabe mencionar que PHP ya tiene una función para computar el MD5 de un archivo, muy recomendable para no tener que usar file_get_contents y cargar todo el archivo en memoria.

http://php.net/manual/es/function.hash-file.php
Código (php) [Seleccionar]
$md5 = hash_file('md5', $url);

Dicho esto, si solo quieres descartar la opción de que se suban archivos duplicados, saca el hash antes de moverlo (move_uploaded_file), comprueba si existe en la BD y si existe, deja de hacer lo que estás haciendo.

Código (php) [Seleccionar]
$ruta = $_SERVER['DOCUMENT_ROOT']."/plugins/mensajeria/archivos/chat_do/videos";
$url = $ruta."/".$_FILES['archivo']['name'];

$rutaTemporal = $_FILES['archivo']['tmp_name'];
$md5 = hash_file('md5', $rutaTemporal);

$consulta = "SELECT md5 FROM chat_do WHERE md5 = '$md5'";
$result = $conexion->query($mostrar);
$row = $result->fetch_assoc();

if (empty($row)) {
   // aquí prosigues subiendo tu archivo
} else {
   // aquí le avisas de que el archivo ya esta subido
}



Ojo, tu código es un coladero total.  Muy inseguro. Permites la subida de cualquier archivo, tienes inyecciones SQL... un desastre.

https://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL
https://stackoverflow.com/questions/38509334/full-secure-image-upload-script

Saludos