2011-06-11 29 views
8

Estoy desarrollando una aplicación web usando Codeigniter. Cuando un usuario se autentica con mi sitio, actualmente estoy almacenando su 'identificador de usuario' en mi cookie de sesión (en la que he activado el cifrado). Varias de mis clases modelo usan el valor en el parámetro 'identificador de usuario' de la sesión/cookie para realizar cambios en las propiedades de las cuentas de usuario.Pregunta de seguridad Codeigniter/PHP sessions

Mi preocupación es que me pregunto si es posible que alguien tome una cookie de codeigniter-session válida con un identificador de usuario que he establecido, cambie el valor del identificador de usuario por el valor de un usuario diferente, y hacer cambios a la cuenta de otro usuario. ¿Las sesiones codeigniter/php crearían un error si alguien intentara cambiar una propiedad de una cookie de sesión?

Respuesta

19

Abra su /application/config/config.php, ubique "sess_use_database" y cámbielo a "TRUE" si aún no lo ha hecho. De esta forma, todas las variables de sesión se almacenarán en una tabla de base de datos y la cookie de sesión solo contendrá la cadena de id. De sesión.

Para mayor seguridad, también puede cambiar "sess_match_ip" a TRUE. De esta forma, si alguien roba la cookie de su usuario e intenta pasarla como suya, la sesión se destruirá.

+3

A partir del último CodeIgniter 3.0.1, el nombre 'sess_use_database' ha sido reemplazado por' sess_driver' que se puede establecer en 'database'. Los últimos documentos afirman que el controlador 'file' predeterminado es la opción más segura: http://www.codeigniter.com/user_guide/libraries/sessions.html –

+0

Impresionante saber. – b3tac0d3

3

No estoy seguro de cuál es exactamente su "identificador de usuario". La regla general es, no almacenar nada en la cookie de sesión, sino la ID de la sesión. Almacene todo lo demás (como una ID de usuario) internamente en el lado del servidor y recupérelo usando la ID de la sesión.

Si el usuario cambia la ID de sesión (que es una cadena aleatoria), se iniciará una nueva sesión. La idea detrás del ID de la sesión es que es imposible adivinar los ID de otros usuarios, por eso es aleatorio y largo.

+0

¿Sabes por casualidad si la clase de sesiones de codeigniter tiene la funcionalidad para hacer esto? Estoy de acuerdo en que es una buena idea. Por ejemplo, si hago esto: $ this-> sessions-> set_userdata ('id', 5); ¿Este valor se transmite de ida y vuelta en la cookie al usuario o simplemente se almacena en el servidor y se asocia con una identificación de sesión? –

+0

@Casey No estoy familiarizado con CI, pero de acuerdo con [documentos] (http: // codeigniter.com/user_guide/libraries/sessions.html), los datos de hecho están almacenados en la cookie. Muestran una opción de base de datos segura a través de –

+0

Mi 'identificador de usuario' es básicamente la clave principal de la tabla de mi usuario para cada usuario. Lo estoy usando en consultas SQL para modificar las propiedades asociadas a cada usuario. Soy consciente de que esto es probablemente terrible. –

4

"si es posible tomar una validez de galletas CodeIgniter sesión cambiar el valor del identificador-usuario a el valor de un usuario diferente, y realizar cambios en la cuenta de otro usuario ."

Mi respuesta no está realmente relacionada con CI, así que tenlo en cuenta.

Al autenticar al usuario "nombredeusuario1", lo que debe devolverse al cliente, para fines de autenticación, debe ser un hash que el servidor correlacione con ese usuario. Toda la comunicación entre el cliente y el servidor se basará en ese hash.

El servidor generará un hash único por usuario y el hash debería tener poco tiempo de vida. ¿Puede alguien capturar un hash y pasar como ese usuario? Ciertamente. Es por eso que también debe verificar el Agente e IP del usuario para verificar si coinciden con el hash para evitar el secuestro de la sesión.

Nunca haga esto:
Si visto algunos nuevos desarrolladores almacenar el nombre de usuario en una cookie y reliing en esa variable cliente enviado a actualizar sus bases de datos. Nunca hagas esto Nunca confíes en el cliente. Cuando el servidor obtiene el hash del cliente, debe verificar si pertenece a un usuario autenticado y obtener el user_id (variable para actualizar los datos del usuario) del servidor. NUNCA del cliente.

Cuestiones relacionadas