2011-06-29 16 views
5

Cuando un usuario inicia sesión en el sitio web, solo guardo user_id en SESSION para consultarlo más tarde, ya sea que el usuario haya iniciado sesión o no.

if(!empty($_SESSION['user_id'])){ 
    .... 

¿Esto es suficiente para la seguridad?

+3

Cuidado: Puede haber un usuario con 'id == 0'. – Jon

+1

Sí, así que use isset()! Ver también mi respuesta. – ComFreek

+0

Técnicamente, y considerando solo el caso básico, * sí *. Aparte de eso, debe volver a utilizar un marco de autenticación existente siempre que sea posible, porque, en realidad, es complejo. Por ejemplo, eche un vistazo a https://github.com/delight-im/PHP-Auth, que es tanto agnóstico como independiente de la base de datos. – caw

Respuesta

12

Esto dependería completamente de cómo esa variable llega a la sesión y qué tan bien está administrando la sesión.

Un caso que siempre se debe tener en cuenta al tratar con la seguridad del sitio web y las credenciales del usuario es la posibilidad de que un usuario inicie sesión en su sitio en un entorno público y luego se vaya. ¿Cuánto tiempo permanecerá conectado? ¿Qué tan accesible es la información sensible cuando ya está conectado?

Si tiene un tiempo de espera de sesión relativamente corto y se asegura de que está administrando lo que lo convierte en $ _SESSION ['user_id'], este es un enfoque razonable. Puede ser mejor verificar realmente el VALOR de lo que está en $ _SESSION ['user_id'] pero eso no será una gran mejora sobre lo que tienes actualmente.

Lo principal que recomendaría tomar en cuenta sería requerir credenciales de inicio de sesión, una vez más, si un usuario quiere nunca para alterar detalles/acceso a datos excesivamente sensibles de su cuenta (que no le gustaría un extraño cambio de inicio de sesión de los usuarios nombres, ¿verdad?). Si bien esto puede ser un poco molesto para los usuarios habituales, definitivamente agrega una buena medida de seguridad a su aplicación.

+3

+1 para solicitar credenciales de inicio de sesión en la actualización detallada de la cuenta. –

7

El valor solo se puede cambiar si alguien tiene acceso a los archivos de la sesión.

Por lo general, .

Pero me gustaría utilizar en lugar isset():

function loggedIn() 
{ 
    if (isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id'])) 
    return true; 
    return false; 
} 

Porque si el identificador de usuario es 0, empty() también regresará verdad!

0

Depende ...

si nunca haces algo así como $ _SESSION [ 'user_id'] = $ _GET [ 'user_id'] por lo general, se puede decir: es ahorrar.

PERO hay cosas como secuestro de sesión, scripts entre sitios, falsificaciones de solicitudes entre sitios, etc.

-1

En realidad, aparte de los comentarios anteriores, debe verificar propiedades como la dirección IP o USER_AGENT para evitar el secuestro de la sesión.

+1

Una sesión basada en una dirección IP fija es algo malo. Las IP no siempre son estáticas entre las solicitudes. –

+0

Estos han sido dos ejemplos, puede haber otras formas de volver a verificar una sesión válida. Sin embargo, una sesión basada en IP puede no ser buena, pero es realmente malo confiar solo en una ID de sesión –

1

Si se encuentra en un entorno de alojamiento compartido, alguien más en el mismo servidor podría crear una sesión válida y obtener acceso.

O, alguien podría estar oliendo el tráfico de la red ya que uno de sus usuarios visita el sitio y podría atrapar la cookie y obtener acceso a su cuenta ya que solo usa autenticación basada en sesión simple.

Una forma común de resolver este problema es crear una tabla de base de datos, quizás llamada "sesiones", y registrar la identificación de sesión, dirección IP y cualquier otro dato específico del usuario que desee recopilar cuando el usuario inicia sesión por primera vez Luego, puede verificar repetidamente esta tabla de sesión para asegurarse de que efectivamente es el usuario original que inició sesión y no otra persona.

+0

Sí, tiene razón. Ya tuve una mesa de sesión en DB. Es mas seguro Gracias a – dino

+1

@dino - Genial, entonces ya estás adelantado al juego. Siempre que se asegure de usar isset() como otros lo han mencionado y verifique que los usuarios que han iniciado sesión coincidan con la tabla de sesiones, debería tener una buena seguridad para las sesiones de los usuarios. Hay otras estrategias que podría emplear para mayor seguridad e incluso llegar tan lejos como los protocolos criptográficos para proteger los datos reales que se transmiten, pero para la mayoría de los sitios genéricos debe estar perfectamente bien con lo que tiene. ¡Buena suerte! – Nick

0

Uso

if(!isset($_SESSION($user_id){ 

Porque si el == $ user_id 0 entonces IsEmpty() no funcionará y asegúrese de que la sesión que no se requiere en otra página debe ser desactivada después del final de página para el mejor seguridad. El método para desarmar una variable de sesión particular es

unset($_session_variable_name); 

y la sesión debe ser destruido siempre que se requiera es decir, cuando un cierre de sesión de usuario.

Gracias

Cuestiones relacionadas