2009-08-30 20 views
7

Quiero hacer un sistema de inicio de sesión utilizando cookies/sesiones, pero no estoy seguro de qué seguridad y cosas así son con ellos.Sistema de inicio de sesión (PHP) Cookies y sesiones

Con las sesiones, si "inicio de sesión" está configurado en "sí", ¿puedo confiar en eso? ¿Los usuarios pueden cambiar lo que devuelve? ¿Debo simplemente almacenar la contraseña encriptada y verificarla en cada página?

Con las cookies, ¿tendré que comprobar si hay inyecciones de mysql?

Esto puede sonar como algo para principiantes, pero sería realmente útil si alguien pudiera aclararlo. Gracias de antemano por cualquier respuesta!

Respuesta

7

Si configura una variable de sesión, el usuario no puede cambiarla directamente a menos que secuestre otra cookie de sesión.

Lo que hay que tener en cuenta principalmente es el alojamiento compartido, los datos de la sesión no son seguros (normalmente otros sitios pueden verlo).

También vale la pena señalar que los datos de cookies tampoco son seguros. No se debe confiar en él de la misma manera en que no se debe confiar en los datos del formulario (sin importar lo que le indique la validación del cliente).

Sus mejores prácticas con las contraseñas son:

  1. almacenar la contraseña en la base de datos en un formato hash, preferentemente SHA1 (primera opción) o MD5 (segunda opción);
  2. Cuando recibe la contraseña del usuario, encriptela y compárela con lo que está almacenado en la base de datos;
  3. Establezca el nombre de usuario registrado en la sesión del usuario;
  4. Expirar la cookie después de un período (incluso si es días) en lugar de tener que dura para siempre; y
  5. Use una conexión segura (HTTPS no HTTP) cuando sea posible. Los certificados SSL son baratos.
+0

¿Quiere decir esto que yo debería comprobar la conexión del usuario y la contraseña en cada página cargada? ¿Y cómo es la mejor manera de mantener segura la base de datos de contraseñas y el método de cifrado? –

+1

@Grue no solo cuando inician sesión, sino que necesita una política de invalidación sensata. Diferentes direcciones IP, duración determinada, duración de la inactividad, etc. Lo que tenga sentido para lo que está protegiendo (por ejemplo, un sitio web bancario tiene diferentes consideraciones de seguridad para otro en el que simplemente deja comentarios en los videos). – cletus

+3

Algunas cosas bastante anticuadas en esta respuesta. No use SHA1 o MD5 para las contraseñas: http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely –

3

Regla de oro: no confíes en la entrada del usuario. Las cookies son entradas de los usuarios, las identificaciones de las sesiones que se almacenan en las cookies son entradas del usuario, las cabeceras http son entradas de los usuarios; estas cosas se deben verificar por triples para cada cosa posible. Los datos de sesión, por otro lado, se almacenan en su servidor, por lo que es más o menos seguro si no se almacenan en/tmp.

Una de las configuraciones más populares para la autorización de sesión es esta: la identificación de la sesión se almacena en una cookie, y todo lo demás, incluida la contraseña, se almacena en la sesión. Después de iniciar una sesión basada en el ID de una cookie, debe obtener el ID de usuario de los datos de la sesión y luego verificar si la contraseña almacenada allí todavía es válida.

0

de entrada Todas y cada usuario tiene que ser analizado y desinfectado religiosamente, ya sea GET y POST, los datos de los datos de cookies ..

Para responder a su pregunta si va a guardar el estado de inicio de sesión en una sesión var es segura, la respuesta Es sí. Simplemente recuerde desinfectar todo lo que el usuario le envíe, sin importar cuán seguro se supone que sea.

5

Como varias personas han declarado, no confíe nunca en la opinión del usuario. Al desinfectar su entrada, especialmente los campos de nombre de usuario & que ayuda a evitar los ataques de inyección de SQL.

Por todo lo que es bueno & santo no almacena nombres de usuario o contraseñas en las cookies, se devuelven & al servidor en cada solicitud y cualquiera que vea la transmisión puede obtener esos datos ... entonces estás en un gran problema.

Aquí hay un par de artículos que debe leer sobre sesiones, seguridad y hashing - simplemente no es suficiente con sus contraseñas a SHA1 o MD5, saltelas para que sean aún más robustas. No existe la seguridad impenetrable, incluso si haces TODO lo correcto, alguien puede romperla, es inevitable. Tu trabajo es hacer cosas tan difíciles de romper/explotar como sea posible.

Cuanto más trabajo implique irrumpir en su sitio, más valioso debe ser su contenido para que valga la pena el esfuerzo. Su trabajo es desalentar a los usuarios maliciosos.

Este artículo tiene algo de información agradable en la creación de huellas digitales únicas para sus visitantes, ayuda a hacer el robo de sesiones más difícil - PHP Security Guide: Sessions

Este artículo trata de la contraseña de base de hash & técnicas de salazón - Password Hashing

Este es, de no significa un fin, todos & se todo - puede hacer una carrera haciendo la seguridad y cosas por el estilo, pero son un buen punto de partida. Alguien aquí probablemente pueda señalar artículos mejores/más avanzados, pero personalmente los he encontrado útiles para reforzar mi código.

2

Una buena práctica para usar es tener 3 variables almacenadas. Uno para si están conectados, uno para su nombre de usuario y otro para un hash generado aleatoriamente (que se genera cuando inician sesión y se almacenan en una base de datos junto con la información del otro usuario). De esta forma, si cambian su nombre de usuario que puede almacenarse en sus cookies, no coincidirá con el que se generó para ese usuario cuando iniciaron sesión.

Ejemplo: Los datos de las cookies podrían ser: logged_in = true; usuario = 'admin'; sessionid = [ID generado aleatoriamente (por lo general solo md5 una palabra generada aleatoriamente que creo)]

Cada vez que inician sesión, se genera un nuevo sessionid y se almacena en la base de datos en su propio campo. Ahora, si tuviera que cambiar la información de mi cookie y cambiar la variable de usuario para decir 'usuario' (que sería otro usuario, podrían estar intentando conectarlo). El sessionid ya no coincidiría con el del segundo usuario y el inicio de sesión sería denegado.

Aquí está un ejemplo rápido que le robé a un proyecto CI trabajé en un par de semanas:

function logged(){ 
$logged_in = $this->session->userdata('logged_in'); 
if($logged_in){ 
    $userid = $this->session->userdata('userid'); 
    $sessionhash = $this->session->userdata('hash'); 

    $this->db->where('id', $userid); 
    $this->db->where('hash', $sessionhash); 
    $query = $this->db->get('members'); 

    if($query->num_rows == 1){ 
    return TRUE; 
    }else{ 
    return FALSE; 
    } 
} 
} 
Cuestiones relacionadas