sql >> Base de Datos >  >> RDS >> Mysql

Formulario de inicio de sesión de PHP con formulario HTML

Solo por el bien de la cabeza (para que tenga una idea de por qué Fred -ii- dijo que no usara este código), voy a desarmar esto un poco, en orden, a medida que lo analice (no es una excavación personal a la persona que plantea la pregunta, pero solo para dar una idea de que tratar de construir una aplicación medianamente segura en la pila LAMP requiere un poco de cuidado y previsión... y un cinismo sanguinario junto con asumir lo peor en la humanidad ayuda):

Punto 1

No es gran cosa, pero en realidad, si va a iniciar una sesión, debe iniciar una sesión independientemente de si hay $_POST datos o no. Probablemente debería solicitar su archivo de configuración e iniciar la sesión en la parte superior antes que nada.

No es un error de terminal (ya que no tiene validación de sesión), simplemente raro.

Punto 2

Tienes salida en este archivo (echo ) por lo tanto debe estar bajo la raíz del documento y disponible en el árbol web.

include("config.php");

Esto realmente no está escrito correctamente, probablemente debería ser require_once 'config.php'; (asumiendo que es un archivo de programa requerido y no una inclusión opcional que puede fallar) pero eso es no el error El error es que tienes tu archivo de configuración dentro de la raíz de tu documento. Una configuración incorrecta del servidor o un simple error tipográfico en ese archivo podría, teóricamente, permitir que el contenido de ese archivo se muestre en la pantalla en texto sin formato, lo que podría revelar las cadenas de conexión de su base de datos (y quién sabe qué más) a world + dog.

Los archivos de configuración deben existir fuera del árbol web o, en su defecto, dentro de un directorio protegido con algo como .htaccess Deny from all . Nunca deberían ser accesibles a través de HTTP.

Punto 3

El mysql la biblioteca está en desuso y no debe usarse en absoluto; MySQLi o PDO son el camino a seguir, idealmente con parámetros/valores vinculados:

http://uk3.php.net/PDO

http://uk3.php.net/mysqli

Personalmente, me quedaría con DOP.

Puntos 4 y 5

$password = mysql_real_escape_string(stripslashes(md5($_POST['password'])));

En primer lugar, el orden de esto es incorrecto. Estás codificando $_POST['password'] y entonces intentando hacer stripslashes:no habrá barras una vez que se haya procesado. Sin embargo, si está tratando de evitar que las personas usen barras inclinadas (o lo que sea) en las contraseñas, deberá eliminarlas antes de codificar la cadena.

Siguiente md5 no debe usarse como un algoritmo de hashing de contraseñas, se ha descubierto que es débil y puede forzarse bruscamente para crear colisiones de cadenas con mucha más frecuencia de lo que debería.

Sí, debería solo almacene hashes o "huellas dactilares" de las contraseñas en lugar de las contraseñas en sí, pero, idealmente, desea sal y hash (con al menos sha1 ) esas contraseñas en lugar de simplemente arrojarlas a un md5() función.

Ver:http://uk3.php.net/mcrypt por ejemplo

Y realice una búsqueda sobre "contraseña salting hashing" utilizando el motor de búsqueda de su elección.

Punto 6

SELECT id FROM $table 
WHERE username = '" . $username . "' 
and password = '" . $password . "';

Agregué en el = eso faltaba en la pregunta original, pero aún así, no coincide con el nombre de usuario y la contraseña en su consulta ... si alguien lograra obtener una inyección SQL en su nombre de usuario, la contraseña nunca se verificaría. Imagina:

SELECT user.id 
FROM user WHERE user.username = 'fred' OR 1 = 1 
-- AND user.password = 'abc123'

Es mejor seleccionar la identificación del usuario y la huella digital de la contraseña de la base de datos y luego evaluar la contraseña en la aplicación en lugar de confiar en una verificación de contraseña en la capa de la base de datos. También significa que puede usar un algoritmo de hashing y salting dedicado en la propia aplicación para validar sus contraseñas.

Punto 7

$_SESSION['user'] = $_POST["username"];

¿Esto es simplemente almacenar el nombre de usuario en la sesión? Esto de ninguna manera debe usarse como un "verificador de inicio de sesión", especialmente porque (aparentemente) no hay nada en su sesión para evitar secuestro .

La identificación de la sesión se podría oler fácilmente de la cookie de una sesión en vivo y eso es todo lo que se necesitaría para "tomar prestado" el inicio de sesión de otra persona. Al menos debería intentar mitigar la posibilidad de que la sesión sea secuestrada asociando la dirección IP del usuario, la cadena UserAgent o alguna otra combinación de datos relativamente estáticos con los que pueda comparar en cada página... aunque hay inconvenientes en prácticamente cualquier enfoque. (especialmente, como descubrí, si tiene visitantes que usan AOL), pero puede hacer una huella digital de sesión probablemente más del 99% efectiva para mitigar el secuestro con muy pocas posibilidades de que la sesión del usuario se descargue por error.

Idealmente, también puede querer crear un token para la sesión para mitigar CSRF ataca cuando el usuario necesita realizar una acción "privilegiada" en la base de datos (actualizar sus detalles o lo que sea). El token podría ser un código completamente aleatorio y único almacenado en la base de datos y/o en una cookie SSL cuando el usuario inicia sesión (suponiendo que el usuario no pueda realizar ninguna acción que actualice la base de datos fuera de HTTPS, ya que eso solo transmitiría los datos en texto claro a través de Internet, lo que sería una mala idea ).

El token se coloca en un campo de formulario oculto para cualquiera/todos los formularios y se compara con el valor almacenado en la cookie (o sesión o base de datos) cada vez que se envía ese formulario. Esto garantiza que la persona que envía el formulario tenga al menos una sesión activa en su sitio web.