Cuando digo comparaciones de hashes me refiero a que una vez que se seleccione el archivo, el servidor creará un hash y luego de que se cargue el archivo, creará otro hash del mismo archivo para ver si se ha manipulado.
En primer lugar, no puede confiar en nada del lado del cliente. Un usuario malintencionado podría crear una solicitud POST que simplemente envíe el hash y el archivo correctos. (Esto también se puede hacer con los datos de manipulación)
El hash protege solo contra la manipulación cuando el hash es más confiable que el archivo.
Para asegurar esto, enseñe cualquier secuencia de comandos que tenga en el backend para rechazar los ejecutables (mejor aún, permita solo desde un pequeño subconjunto de extensiones). Por lo tanto, solo puede verificar si el nombre de archivo recibido es de un tipo de imagen. Un atacante no puede falsificar eso sin tener acceso a su servidor.
Si desea más seguridad, puede validar que se trata de una imagen pasándola a través de alguna función de análisis de imágenes.
Tenga en cuenta que su servidor debe configurarse para que todas las cargas se almacenen de tal manera que no puedan ejecutarse (hacer que el directorio estético en Apache ayude parcialmente a esto, también debe protegerse contra la inclusión de archivos) .