2012-05-12 16 views
14

Más tarde estaba preguntando cómo cerrar la sesión correctamente un usuario, ahora veo que usar solo cookies para mantener a un usuario conectado no es seguro en absoluto.¿Cuál es la forma correcta y segura de mantener a un usuario conectado? ¿galletas? ¿sesión? PHP && MYSQL

Guardar la contraseña en una cookie no es un método seguro para hacerlo, por lo que mi pregunta es: ¿Cuál es la forma correcta de hacer un (iniciar sesión/mantener al usuario conectado) en mi sitio web?

Actualmente almaceno la identificación de usuario que es la misma que la url necesita para mostrar el perfil de usuario X, y el correo electrónico y la contraseña encriptados en MD5.

Setcookie es la única función que uso cuando se inicia sesión con éxito. Solo uso sesiones para almacenar números aleatorios para evitar envíos de formularios repetitivos. campos ocultos.

• ¿Puede mostrarme cómo es la forma correcta y segura de hacerlo?
• ¿Cuál es su manera de hacerlo?

PHP solamente. Dos meses en php, todo aprendí de tus respuestas. Gracias

+0

que no entiendo. ¿por qué almacenarías la contraseña en una cookie? Use sesiones, no cookies. Simplemente almacene un valor booleano en una variable de sesión para verificar si un usuario está conectado o no. – Flukey

+0

@Flukey: el ID de la sesión generalmente se transfiere a través de una cookie. Se puede robar como se puede robar una contraseña, y el atacante podría iniciar sesión como usted sin necesidad de escribir su contraseña. –

+5

posible duplicado de [La guía definitiva a la autenticación de sitios web basada en formularios] (http://stackoverflow.com/questions/549/the-definitive-guide-to-forms-based-website-authentication) – eggyal

Respuesta

6

Me gustaría utilizar una sesión.

Para ayudar un poco en la seguridad, una vez que las credenciales de los usuarios han sido verificadas use session_regenerate_id - dado que la identificación de la sesión es transmitida en una cookie, esto es importante si alguien husmea mientras se inicia sesión en procesado.

NO ALMACENE ninguna información en la sesión relacionada con las credenciales de acceso: un ID de usuario suele ser suficiente; Personalmente, construyo un objeto de usuario que almaceno en la sesión (estos se serializan/deserializan automáticamente entre solicitudes, pero se puede leer de forma independiente).

Si desea establecer una cookie para que el usuario no tenga que iniciar sesión en la próxima visita, tal vez almacene el identificador de usuario y un token generado automáticamente que pueda verificarse en la base de datos (o similar) - Añadiría extras a la comprobación también, como almacenar la última dirección IP con el token para comprobar también, si no coinciden, solicite el inicio de sesión una vez más.

Hay bastantes enfoques que se pueden tomar: no ofrezco todo/'lo mejor', obtengo su código revisado por personas en una comunidad de php, aprende más de esa manera.

25

Primero, déjame decirte esto. Nada es 100% seguro. Nada es hermético, y nada es sagrado. Si está lo suficientemente motivado, un atacante romperá todas las defensas del lado del servidor que pueda poner (a menos que esté usando HTTPS, que es una historia diferente).

Puede utilizar cookies, pero las cookies están muy expuestas y se modifican fácilmente. Nunca almacene datos privados o niveles de acceso en una cookie. Como es fácilmente robado/modificado por un atacante.

Las sesiones tampoco son 100% seguras. El ID de sesión, que el servidor usa para identificar al cliente, se envía de una de las 2 formas. una variable $ _GET (mala), o una cookie (mejor, pero aún bastante mala). Es decir, si has iniciado sesión como administrador, a través de un WiFi no seguro, un atacante habilidoso (y un hábil me refiero a un pr0 haxx0r que descargó un simple sniffer HTTP) puede robar fácilmente tu ID de SESIÓN. Y aunque no obtenga su contraseña, el servidor identificará erróneamente al atacante como usted y le otorgará cualquier acceso que pueda tener/tener.

¿Qué hacer? Las sesiones son en la mayoría de los casos seguras. Recomiende a sus usuarios que no inicien sesión en una red no segura (autobuses, cibercafés, etc.).Si desea permitir que su autorización de usuario persista en el tiempo, se requiere una cookie. Yo suelo usar un sistema de 2 cookie si necesito que:

userid=12345 
hash=$userid . $password . $user_specific_random_pregenerated_salt 

Entonces tengo algo va a contrastar, y los datos del usuario no fueron revelados.


Pero como he dicho, en el final del día, si realmente muchas ganas de asegurar sus usuarios, de arriba a todo lo demás escrito en esta respuesta, se consigue HTTPS.

+0

muy buena respuesta, ¿puede decir algo como lo anterior para https también? me encantaría leer eso. me acabas de enseñar muchas cosas en una sola respuesta. si solo puedo obtener información sobre https, estaré muy agradecido. un enlace tal vez. ? –

+0

@RishirajPurohit Consulte https://letsencrypt.org/ –

+0

Gracias, estimúlenlo –

3

Si una persona tiene un nombre de usuario y contraseña, esto se puede configurar como una cookie en su navegador para que no tenga que volver a iniciar sesión en su sitio web cada vez que lo visite. Puede almacenar casi cualquier cosa en una cookie del navegador. El problema es que un usuario puede bloquear las cookies o eliminarlas en cualquier momento. Si, por ejemplo, el carrito de compras de su sitio web utilizaba cookies, y una persona tenía su navegador configurado para bloquearlas, entonces no podían comprar en su sitio web.

Cuando almacena datos en cookies, debe estar absolutamente seguro de que los usuarios no pueden alterar los datos de ninguna manera. No hay forma de evitar que los usuarios alteren los datos en una cookie; es absurdamente fácil. Por lo tanto, para garantizar que su sitio web no acepte cookies que contengan datos alterados, debe cifrar los valores de las cookies o firmarlos con un hash que le permita verificar su integridad.

+1

, incluso si una cookie está encriptada, no hay nada que impida que alguien robe la cookie y la use para iniciar sesión. Si tienen acceso a la computadora, es como dejar tu contraseña en la computadora –

2

Como @Madara dijo que nada es 100% seguro y correcto, pero como punto de vista del desarrollador, diría que todos y cada uno de los métodos para conservar los datos de la sesión del usuario tienen sus propias ventajas y desventajas, por ejemplo.

datos de usuario en cookies vs Sesión

Si estás mantiene los datos de sesión del usuario en cookies que se consumen memoria RAM menos del servidor y el procesamiento, ya que no tiene que guardar información del usuario que ha entrado en la memoria RAM. también si el usuario aumenta, entonces se recomienda mantener los datos de la sesión del usuario en cookies en lugar de la sesión, ya que mantenerla en sesión consumiría los recursos del servidor y su aplicación podría ser más lenta y no responder en algún momento. donde, como si estuviera, mantiene en sesión los datos del usuario registrado Sería seguro que las cookies, pero consumiría más recursos del servidor.

En nota final: Tanto las formas son correctas en su propia aplicación también si la aplicación está utilizando protocolo HTTPS entonces la seguridad no debe ser una preocupación. así que sugeriría utilizar métodos para retener los datos de la sesión del usuario de acuerdo con los requisitos de la aplicación y el modelo de negocio.

0

La mejor práctica es usar sesiones de PHP.

período de sesiones A PHP se mantiene haciendo que el navegador devuelve una criptográficamente seguro (es decir, no adivinar que el siguiente valor válido) cadena conocida como el ID de sesión de cada vez que se hace una petición durante esa sesión. La mejor y más segura forma de hacerlo es darle al navegador una cookie de sesión , que luego enviará con cada solicitud.

El método alternativo para usar una cookie de sesión es incluir la ID de la sesión de PHP en la URL de la solicitud misma como una variable GET.Un ejemplo de URL podría ser algo como:

https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

Esto no es tan seguro como el uso de una cookie, ya que la URL accidentalmente podría obtener compartida o robado a través de otros medios.

La seguridad tiene muchas capas, como una cebolla (como en el ejemplo común). Mientras más seguro haga algo, más esfuerzo se necesita para hacerlo seguro y menos conveniente es usarlo. Es una compensación de costo-beneficio. Entonces, usted tiene que preguntar, qué tan importante es su información, es la privacidad y seguridad de su usuario, etc.

Para mí, un nivel base sería usar sesiones PHP con el ID de sesión forzado a estar en cookies (bloquear usuarios que desactivar las cookies), encriptación SSL todo el tiempo, tanto en los datos como en las cookies, y asegúrese de que las diversas configuraciones de PHP que afectan la seguridad de las sesiones estén configuradas de la mejor manera y con la configuración más segura. Usted querrá leer todo el contenido de estas páginas y páginas secundarias:

Cuestiones relacionadas