Estoy trabajando en un sitio web. En este momento se encuentra en las primeras etapas de las pruebas, aún no se ha lanzado y solo tiene datos de prueba. Gracias a Dios.
En primer lugar, un pirata informático descubrió la contraseña para iniciar sesión en las páginas de "administración" de los sitios web * . Creo que utilizaron un registrador de claves en la computadora de un amigo que inició sesión en el sitio para enviarme comentarios.
En segundo lugar, utilizaron un cuadro de carga de imágenes para cargar un archivo PHP. He puesto un estricto control para que solo se acepten los archivos .jpg y .png; todo lo demás debería haber sido rechazado. Seguramente no hay manera de cargar un archivo .jpg y luego cambiar la extensión una vez que se almacena el archivo.
Afortunadamente, también genero nuevos nombres de archivos cuando me envían un archivo, así que no creo que hayan podido localizar el archivo para ejecutar el código.
Parece que no puedo entender cómo el sitio web deja pasar un archivo PHP. ¿Qué pasa con mi seguridad? El código de la función de validación está abajo:
function ValidateChange_Logo(theForm)
{
var regexp;
if (theForm.FileUpload1.value == "")
{
alert("You have not chosen a new logo file, or your file is not supported.");
theForm.FileUpload1.focus();
return false;
}
var extension = theForm.FileUpload1.value.substr(theForm.FileUpload1.value.lastIndexOf('.'));
if ((extension.toLowerCase() != ".jpg") &&
(extension.toLowerCase() != ".png"))
{
alert("You have not chosen a new logo file, or your file is not supported.");
theForm.FileUpload1.focus();
return false;
}
return true;
}
Una vez que el archivo llega al servidor, uso el siguiente código para conservar la extensión y generar un nuevo nombre aleatorio. Es un poco desordenado, pero funciona bien.
// Process and Retain File Extension
$fileExt = $_FILES[logo][name];
$reversed = strrev($fileExt);
$extension0 = substr($reversed, 0, 1);
$extension1 = substr($reversed, 1, 1);
$extension2 = substr($reversed, 2, 1);
$fileExtension = ".".$extension2.$extension1.$extension0;
$newName = rand(1000000, 9999999) . $fileExtension;
Acabo de realizar pruebas con un nombre como logo.php;.jpg
y, aunque el sitio web no puede abrir la imagen, cambió el nombre correctamente a 123456.jpg
. En cuanto a logo.php/.jpg
, Windows no permite tal nombre de archivo.
* Páginas protegidas en el sitio web que permiten funciones simples: como cargar una imagen que luego se convierte en un nuevo logotipo para el sitio web. Los detalles de FTP son completamente diferentes a la contraseña utilizada para iniciar sesión en las páginas protegidas en el sitio web. Como son las bases de datos y las credenciales de cPanel. Me he asegurado de que las personas ni siquiera puedan ver la estructura de carpetas y archivos del sitio. Literalmente, no se me ocurre ninguna forma de cambiar el nombre de una extensión .jpg o .png a .php en este sitio si no tiene detalles de FTP.