Control de sesiones WEB con vModApache


([N4] ikonos) #1

Dado mi alto grado de ignorancia, me gustaría que alguien más versado en "programación distribuida" me de una lección de cual seria el planteamiento, para controlar la "sesión web" de un usuario que entre en una web servida con vModApache.
¿que deberiamos verificar para servir la web?
¿IP cliente, USER_NAME, PASSWORD, TIME_CONEXION?
¿Se verifica en cada peticion de pagina?
¿Tenemos los datos siempre guardados/ocultos en la pagina servida?
GRACIAS


([N2] gegeo) #2

No soy para nada el más versado en programación distribuida, pero te digo como estoy haciendo yo en mis pruebas.

Yo controlo el usuario, password y el id de sesión.
Cada página de la zona privada, en el proceso para mostrarla, lo primero que hago es comprobar usuario y su id de sesión, y si no coinciden con los de la base de datos, no carga la pagina y reenvia a una pagina publica indicando el error.
TODOS los procesos de la zona privada, lo primero que hacen es esta comprobacion.

El id de sesión y usuario lo traslado siempre en la URL, aunque estos pueden ir ocultos en el codigo html.

Saludos ;)


([N1] Valdes) #3

Yo con la V6 generaba un id único con vGuid y los pasaba como sesión que estaba almacenada en una tabla de sesiones para controlar el tiempo y validez de la misma.
.
Saludos
.
Mario Valdés
valdes.m@gmail.com


([N4] ikonos) #4

OK, Gracias a los dos por los comentarios, me queda claro el planteamiento.
Ahora bién, debeis haceros cargo que soy quasi-virgen en la WEB. Mi conocimiento del ID de SESION es practicamente nulo, entiendo que el Id de sesión es un número que el servidor WEB asigna a un "usuario/navegador/browser" por la duración de la visita (sesión) de este usuario, y mientras las peticiones al servidor las haga el mismo "usuario/navegador/browser" durante un determinado espacio de tiempo ese numero de sesión (Id de sesion) será el mismo ¿¿Es asin??
Y partiendo de esa base, ¿como sería el javascript, para capturar el ID de sesión? Se utiliza public String get_SessionID () ¿Como?
Y volviendo a abusar de vuestra generosidad, ¿se puede configurar el tiempo que asigna el servidor a la sesión? O es más practico controlarlo internamente, mediante la tabla de sesiones como apunta valdes.m.gmail
Perdonar por los abusos.


([N1] Valdes) #5

A ver si hago memoria (siempre con la v6..)
Una tabla de SESIONES en la que almacenas.
-ID(fSustituirSubCadena( «VGUID( ), "-", "" ))
-FECHA(fHoy())
-HORA-INICIO(fAhora())
-ULTIMO ACCESO (fAhora())
-ENTIDAD(MAESTRO)
-CADUCADA(BOOLEANA)
.
Cuando alguien accede a la web, creas una sesión y la guardas en una variable que sea visible a WEB. Esta variable la debes de pasar como parametro siempre que cambies de página (suponemos que sabemos pasar variables). En cada proceso que genera el HTML, en su cabecera llamas a una función que debe de comprobar varias cosas:
1. Existe esa sesión (ID)
2. Compruebo el último acceso y si esta dentro del tiempo válido para mantener sesión ( ejem: 5 min ). Si está dentro de los valores que considere oportunos,modificas el último acceso y continuas. En caso de estar fuera de los valores, caducas la sesión y "cierras la puerta" redirigiendo a la zona "no privada".
.
Espero no liarte más...
.
Saludos
Mario Valdés
valdes.m@gmail.com


([N2] gegeo) #6

En cuanto a datos, yo tengo una tabla de usuarios web.
En esta tengo, entre otras cosas, usuario, password y sesión.
El campo sesion es un campo formula alfabetica, que como contenido inicial, tiene una función que calcula el contenido segun unos parametros, entre otros, la hora y los minutos.

En cuanto a aplicación:
En el momento de loguearse en la zona privada, comprueba usuario y password, y si es correcto, coge el id de sesión de la tabla en una variable, y lo traslada a todas las urls que haga click el usuario.
Tambien puedes pasarlas ocultas en el codigo html [input type ="hidden"...]
Todos los procesos de la zona privada, comprobaran que el id de la url esta en vigor, contra la tabla de usuarios.
Mientras no cambie el id(esto depende de los parametros que hayas definido en la funcion) la sesión sera válida, y por tanto, mostrara el contenido que hayas definido. Si no es correcto el id, redireccionara a donde le indiques.

Asegurate de crear las variables locales con el MISMO NOMBRE, en TODOS los procesos que utilices.
Todas de tipo alfabetico, ya que vModApache, UNICAMENTE opera con variables de texto. Si por el motivo que sea, tuvieras que realizar operaciones aritméticas con ellas, deberás convertirlas a numero con la instrucción numberToString(VARIABLE)

El problema está, en el curro que tiene contemplar, en cada proceso, todas y cada una de las posibilidades, para que el usuario no se encuentre con una pagina en blanco.


([N4] ikonos) #7

@Mario,

Has explicado perfectamente como montas las sesiones con v6, generando tu mismo tu propio Id de sesión. Mucha Gracias.

Solo me falta controlar también la otra modalidad, capturar con un script el Id de sesion que asigna el servidor al navegador.

EJEMPLOS! EJEMPLOS!


([N4] ikonos) #8

Gracias Gegeo, por tu aportación, explicación clara y meridiana.

Pero veo que los dos generais vuestro propio Id de sesion, internamente en Velneo ¿lo haceis asi por que de esta forma es más complicado hackear la sesion, que utilizando la propiedad SessionID() que el servidor y el sistema asignan a la conexión?


([N2] gegeo) #9

@ikonos

El servidor no asigna un id de sesión al navegador.
El servidor solo registra un id de sesión con el Apache, y que yo sepa, no puedes obtenerlo si no es desde vAdmin, ni operar con él.
La sesion la tienes que controlar con el sistema que te montes tú.

El sistema que te he explicado yo, es en V7.

La forma de pasar los datos de una pagina a otra, es via variable local a cada proceso, y tienes dos opciones:
-via URL
-via codigo HTML oculto (si alguien mira el codigo fuente de la pagina, lo verá) pero cualquier usuario no se para a mirar esas cosas :)

Para cualquiera de estas opciones, debes tener creadas las MISMAS variables LOCALES a TODOS los PROCESOS.
En el momento que un proceso para mostrar un contenido, no tenga declarada alguna variable... ZASCA, pagina vacia que te crió.

Saludos ;)


([N2] gegeo) #10

@ikonos

Yo lo hago asi, porque era la unica forma que sabia hacerlo :D

Pero no entiendo que SessionID() comentas,
¿de donde sale?
¿que servidor a que navegador?

Non capisco :(


([N4] ikonos) #11

Correcto, correcto. Igual me he explicado mal al decir servidor no me refiero al vServer, yo pensaba que cuando el navegador se conecta con el servidorWEB, es decir APACHE, en el sistema existe la propiedad SessionID() que asigna el servidorWEB al navegador y que podemos capturarla y manejarla bien con un script o con HTML. Al menos eso habia leido por la WEB.


([N2] gegeo) #12

Hombre, Apache tiene su sistema de Log, si quieres capturarlo desde ahi...

Se me ocurre que podrias leer el fichero de texto del log de apache, importarlo a una tabla a V7, y a partir de ahi, trabayar y trabayar...

Pero un poco lio... ¿no? o por lo menos un tanto lioso solo para dar un ID de sesión.
Como Log de acceso web, es más que suficiente.
Este log lo encuentras en la carpeta LOGS del Apache, echale un vistazo y ves los datos que guarda.

Saludos ;)


([N4] ikonos) #13

Gracias, gracias, pero no tengo intención de complicarme la vida, vuestro sistema ya es cojonudo como para buscarle tres pies al gato con el SessionID() del servidorWEB, asi que ya lo tengo claro "el Id sesión se genera en Velneo, y a tomar por ..." ;)
La cuestión es que primero me da por mirar en la red algo acerca del tema, y leo algunos links como estos:
http://msdn.microsoft.com/es-es/library/ms178582(v=vs.80).aspx
http://www.gestiopolis.com/delta/term/TER366.html
y digo ¿coño, estará esto hecho ya? Pero hablando con vosotros me doy cuenta que lo mejor es lo que haceis, "control total desde Velneo"
GRACIAS


([N4] ikonos) #14

Solo una cosa mas, ¿cuando generais el ID de sesion en Velneo imagino que lo componeis tambien con la IP del navegador que ataca el servidor? por que, ¿que pasaria si me clonan el ID de sesion mientras estoy navegando (por que esta en el codigo fuente) y atacan el servidor desde otra máquina? ¿no seria un agujero de seguridad?


([N2] gegeo) #15

ZASCA!! :D

Lo logico es que en el ID de sesión, intervenga algun dato de la maquina que se conecta a la URL, pero estos, deberas obtenerlos desde el APACHE, puesto que las instrucciones estandar de Sistema o las de Cliente-Servidor, CREO te devolveran datos de la maquina que tiene el APACHE y se ha conectado al vSERVER, no del cliente que ha accedido a la web.

O eso, o una vClase nueva :D

Saludos ;)


([N4] ikonos) #16

Por eso pensaba yo en el Id de sesión que genera el servidorWEB (Apache en este caso) para controlar los datos de la máquina que se conecta. Investigaré la carpeta de LOG´s del Apache para ver que información se puede sacar de la máquina que se conecta por la web a Apache.
Aunque yo pensaba que con JavaScript podría acceder a un ID de sesion que le otorgaba el servidorWEB al navegador, con ASP y PHP si que se hace asi e incluso se puede configurar el tiempo de sesion para cada servidorWEB, bucear un poco en el primer link que os he pasado y lo vereis.
Ale! a por una vClase para el log de máquinas en Apache ;)


([N4] ikonos) #17

En mi empeño de incorporar la IP del cliente en el ID de sesion, he estado haciendo pruebas (chapuzas) para leer el Log de Apache en un proceso llamado desde vModApache y comprobar la IP del cliente para controlar la sesion y autorizar la carga de la pagina.
La idea era que al hacer una peticion al servidor Apache, leamos primero el registro para comprobar si se trata de la misma IP, pero como resultado el servidor APACHE se "cuelga" debe ser porque mientras procesa la petición tiene a la vez abierto el registro de Log y hasta que no la completa no lo cierra.
Sin embargo si lo hago desde el vClient no hay ningun problema con el Log, aunque haga simultaneamente peticiones con vModApache para comprobar la IP del cliente.
Con lo cual esta IDEA para verificar IP de clientes, no me ha dado muy buen resultado. Ademas otra pega que le he visto es que retorna la IP del cliente si no utiliza un Proxy (como telefónica) si utiliza Proxy solo regristra la IP del Proxy.

La otra solución utilizar cookies para grabar el Id de sesion que generamos en Velneo, y comprobar las cookies de los documentos que cargamos. ¿Pero que pasa si el cliente no quiere habilitar la cookies en su navegador? Otra castaña.

Tambien se puede intentar obtener la IP con Javascript, pero un método solo funciona con Mozilla, y el otro que he encontrado solo para Netscape, el resto de navegadores no lo soportan por cuestiones de seguridad. Con lo cual otra castaña.

Solo me queda implementar a la vez PHP con vModApache, y duplicar la peticion para comprobar previamente con PHP, pero es una barbaridad el hecho de dupicar todas las peticiones de vModApache en PHP.

Asi que de momento, sin método eficaz y productivo para capturar IP del cliente Web desde vModApache me quedo con la solución clásica.
Si a alguien se le ocurre alguna idea para capturar la IP del Cliente Web que se conecta a un servidor Apache, con páginas servidas en vModApache, QUE SEA VALIENTE Y QUE LO DIGA ;)


([N2] bannu) #18

En PHP:

function getRealIP()
{

if( $_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
{
$client_ip =
( !empty($_SERVER['REMOTE_ADDR']) ) ?
$_SERVER['REMOTE_ADDR']
:
( ( !empty($_ENV['REMOTE_ADDR']) ) ?
$_ENV['REMOTE_ADDR']
:
"unknown" );

// los proxys van añadiendo al final de esta cabecera
// las direcciones ip que van "ocultando". Para localizar la ip real
// del usuario se comienza a mirar por el principio hasta encontrar
// una dirección ip que no sea del rango privado. En caso de no
// encontrarse ninguna se toma como valor el REMOTE_ADDR

$entries = split('[, ]', $_SERVER['HTTP_X_FORWARDED_FOR']);

reset($entries);
while (list(, $entry) = each($entries))
{
$entry = trim($entry);
if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) )
{
// http://www.faqs.org/rfcs/rfc1918.html
$private_ip = array(
'/^0\./',
'/^127\.0\.0\.1/',
'/^192\.168\..*/',
'/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/',
'/^10\..*/' ) ;

$found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);

if ($client_ip != $found_ip)
{
$client_ip = $found_ip;
break;
}
}
}
}
else
{
$client_ip =
( !empty($_SERVER['REMOTE_ADDR']) ) ?
$_SERVER['REMOTE_ADDR']
:
( ( !empty($_ENV['REMOTE_ADDR']) ) ?
$_ENV['REMOTE_ADDR']
:
"unknown" );
}

return $client_ip;

}

Por cierto con PHP, ASP, java, también puedes controlar las sesiones, yo con el vModApache solo obtendría los registros, y las páginas de la Web las pondría fuera del mapa, es decir el vServer solo serviría la información activa.


([N4] ikonos) #19

¿A que te refieres exactamente? con,

las páginas web las pondria fuera del mapa, es decir solo serviria la información activa.

¿como compaginas el PHP con el vModApache?


([N2] bannu) #20

En eso te puede ayudar más filipeagg, yo estoy en ello, pero la idea es que el vModApache devuelva solo los datos de la consulta en formato XML, en PHP tienes funciones para parsear el XML:

<?xml version='1.0'?>
<clientes>
<cliente>
<id>1</id>
<nif>108xxxx</nif>
</cliente>
<cliente>
<id>2</id>
<nif>108xxxx</nif>
</cliente>
</clientes>

$xml = simplexml_load_string($data);
foreach ($xml->cliente as $cliente)
echo $cliente->nif

La variable $data es el XML de retorno del vModApache.