Estoy creando un sitio más grande por primera vez, por lo que la seguridad realmente importa, a diferencia de mis tableros realmente malos, con quizás 10 usuarios. Así que quería preguntarme si la forma en que lo hago es lo suficientemente segura para una aplicación semi-grande donde hay dinero involucrado.
El sitio está escrito en PHP, la base de datos es MySql. Este es el inicio de sesión actual.
En primer lugar, tengo una clave de sesión y sal de 128 signos guardados en la configuración local.
En cada sitio que interactúa con las sesiones (por ejemplo, el panel de control del usuario) tengo este fragmento de código al comienzo del código:
session_start();
if (empty($_SESSION)) {
session_regenerate_id(true);
}
Después de eso, me conecto a la base de datos, escapa todas las cadenas y leo los datos.
Después de eso, comparo las dos contraseñas que se procesaron con SHA-512 y la sal de antes:
public static function hashValue($str) {
for ($x = 0; $x < 10000; $x++) {
$str = hash('sha512', $str . self::$salt);
}
return $str;
}
Si todo es correcto, $_SESSION[$sessionkey]
se establece con el ID de usuario de la base de datos (aunque la clave de la sesión larga no debería ser necesaria porque el cliente no puede cambiar el $_SESSION
vars localmente, IIRC. ¿Verdad? )
Si el sitio está protegido (como en, los usuarios que no han iniciado sesión no tienen acceso) se llama a este código para redirigirlos de nuevo al índice si no han iniciado sesión:
if (!isset($_SESSION[$sessionkey])) {
header("Location: ?view=default");
exit;
}
¿Esta aplicación es segura? He leído en alguna parte que es mejor tener un archivo sal generado aleatoriamente para cada usuario, guardado en la base de datos. ¿Es realmente necesario, teniendo en cuenta que solo previene el brute forzando un poco mejor, lo que no debería ser un problema con un captcha de todos modos?