Comenzaré con un sistema de autenticación simple.
Le pide al usuario su nombre de usuario / contraseña, que envía a su servidor. En el servidor, hash la contraseña para compararla con la base de datos (no voy a hablar aquí sobre la importancia de hacer hashing de una contraseña y usar sal y pimienta).
No, usando una conexión no cifrada (SSL), alguien entre su usuario y su servidor puede leer los datos transmitidos (conocido como ataque Man In The Middle) y conocer su contraseña de usuario.
Para eso, puede usar una conexión SSL para proteger a su usuario de la lectura mientras envía datos al servidor. Es la mejor manera segura hasta ahora (nuevamente, no hablaré de la limitación de SSL aquí).
Pero se puede hacer otra alternativa. Puede hash la contraseña usando md5 / sha directamente en el navegador de su usuario y enviarle el hash. Algunas bibliotecas de Javascript existen para eso. Pero debes recordar que no todos los usuarios tendrán habilitado javascript (excepto que los obligas a usarlo). Además, utilizando este método, no podrá agregar sal y pimienta sin comprometer la seguridad general.
Además, no olvides que esto no te protegerá de nuevo, no registradores de teclas, troyanos y otros. Sólo ataques MitM.
Ahora, para la carga del archivo. La carga de archivos predeterminada de los navegadores, me refiero a que <input type="file" />
no enviará datos cifrados. Si desea hacerlo, deberá implementar un sistema Java o Flash para cargar archivos que cifrarán los datos antes de enviarlos a la red. Nuevamente, esto no protegerá a sus usuarios si tienen un virus en su computadora.
Recuerde que la ideología entre cliente < - > El servidor es su relación entre ellos. No puede proteger a su usuario contra virus, solo puede mejorar la seguridad en el enlace entre el cliente < - > servidor y también su servidor.
Ahora, si desea proteger su servidor para la carga de código malintencionado, habilitar la seguridad en el lado del cliente será inútil. No puedes nunca confiar en lo que los usuarios te envían. Incluso si creas la aplicación html más sofisticada, alguien podrá enviarte datos sin usar esta aplicación.
Todo lo que tiene que hacer es mejorar la seguridad en su servidor: verifique si el archivo enviado es del tipo correcto al verificar su tipo MIM (con la herramienta correcta, no solo la extensión). Siempre rechace los archivos que se pueden ejecutar (.exe, .sh, etc.) y más, asegúrese de qué hacer con esos archivos. (Puede permitir la carga de archivos .php, ¡pero debe colocarlos en un directorio donde no se puedan ejecutar desde una ubicación remota!)