Ticket #1041 (closed defeito: fixed)

Opened 11 years ago

Last modified 10 years ago

Problema na validação da sessão por IP

Reported by: amuller Owned by: niltonneto
Priority: grave Milestone: Expresso 2.0.7
Component: API Version: branch 2.0
Severity: Keywords:
Cc: WorkGroup:

Description

Foi encontrado um problema na validação do IP pela sessão. Ele estava sendo validado de maneira errada.

Change History

comment:1 Changed 11 years ago by amuller

r2522 corrige o problema

comment:2 Changed 11 years ago by amuller

r2558 aplica no branches 21

comment:3 Changed 11 years ago by niltonneto

  • Version changed from trunk to branch 2.0

Replicado no Branch 2.0 [2582]

comment:4 Changed 10 years ago by niltonneto

Infelizmente, esta validação causa problema se a configuração de usar HTTPS estiver habilitada somente para o login (use_https=1 no header.inc.php). Neste caso, quando o Expresso é acessado via proxy http, a variável $_SERVER[X_FORWARDED] vem vazia, e o Expresso então salva o IP existente na variável $_SERVER[REMOTE_ADDR], que é o IP do proxy . Após o login, como redirecionamento então é feito para o HTTP, o Expresso consegue carregar o IP de $_SERVER[X_FORWARDED], que é o IP da máquina atrás do proxy, e aí gera problema na validação da sessão.

comment:5 Changed 10 years ago by niltonneto

Na verdade, se o Expresso for acessado via Proxy e utilizar HTTPS (o que é recomendado) esta validação por IP será furada, uma vez que o servidor Web não devolve em seu cabeçalho o IP de origem, apenas do proxy. Resumindo: Qualquer um que usar aquele proxy será logado com mesmo IP no Expresso. Alguma ideia para solucionar isso?

comment:6 follow-up: ↓ 7 Changed 10 years ago by amuller

Eu tenho uma idéia mais ou menos assim. Agente guarda os dois IP's, quando é possível. Quando o X_FORWARDED está vazio agente deixa ele pendente, como não especificado. Quando vier uma requisição olha pros dois IP's:

SE O X_FORWARDED estiver setado, então vê se ele está indefinido na session, então atualiza ele. Senão vê se este valor bate, se não bater desloga o cara. Se ele estiver vazio compara com o IP do proxy.

A idéia é mais ou menos assim, guarda os dois valores quando possível. Enquanto o valor do forwarded vier vazio vai deixando o cara usar. Assim que ele for setado 1 vez, define ele e não deixa que venha diferente (pode até vim vazio)

comment:7 in reply to: ↑ 6 Changed 10 years ago by niltonneto

Replying to amuller:

Eu tenho uma idéia mais ou menos assim. Agente guarda os dois IP's, quando é possível. Quando o X_FORWARDED está vazio agente deixa ele pendente, como não especificado. Quando vier uma requisição olha pros dois IP's:

SE O X_FORWARDED estiver setado, então vê se ele está indefinido na session, então atualiza ele. Senão vê se este valor bate, se não bater desloga o cara. Se ele estiver vazio compara com o IP do proxy.

A idéia é mais ou menos assim, guarda os dois valores quando possível. Enquanto o valor do forwarded vier vazio vai deixando o cara usar. Assim que ele for setado 1 vez, define ele e não deixa que venha diferente (pode até vim vazio)

Entendi, realmente acho que pode estar aí a solução. Só vou pensar melhor como armazenar essas informações, já que em phpgw_access_log guarda somente o IP carregado pelo get_user_ip. Como armazenar os dois IPs e saber quando um deles vai estar vazio, etc....

comment:8 Changed 10 years ago by niltonneto

  • Owner changed from amuller to niltonneto

comment:9 Changed 10 years ago by niltonneto

  • Milestone changed from Expresso 2.0.6 to Expresso 2.0.7

comment:10 Changed 10 years ago by niltonneto

O funcionamento será assim: Quando a variável do header.inc.php "use_https" for igual a "1", então logo após o login (redirecionamento HTTPS => HTTP) será executado um UPDATE em phpgw_access_log para salvar o IP do proxy (REMOTE_ADDR) com IP do usuário (X_FORWARDED) concatenados, no registro de mesmo sessionID.

Exemplo:

Antes => "10.15.1.1" (ip proxy).

Depois => "10.0.0.9, 10.15.1.1" (ip usuário, ip proxy).

comment:11 Changed 10 years ago by niltonneto

Corrigido no Branch 2.0 [2850].

comment:12 follow-up: ↓ 13 Changed 10 years ago by niltonneto

É preciso remover as seguintes linhas do header.inc.php, após a revisão [2850]:

- if (!isset($_SESSION['connection_db_info']))
- {
-   $GLOBALS['phpgw']->db->query("select trim(sessionid), ip, browser from phpgw_access_log where account_id <> 0 and lo = 0 and sessionid='{$GLOBALS['phpgw']->session->sessionid}' limit 1",__LINE__,__FILE__);
-   $GLOBALS['phpgw']->db->next_record( );
-   $_SESSION['connection_db_info']['user_auth'] = $GLOBALS['phpgw']->db->row( );
-}

comment:13 in reply to: ↑ 12 Changed 10 years ago by niltonneto

Replying to niltonneto:

É preciso remover as seguintes linhas do header.inc.php, após a revisão [2850]:

- if (!isset($_SESSION['connection_db_info']))
- {
-   $GLOBALS['phpgw']->db->query("select trim(sessionid), ip, browser from phpgw_access_log where account_id <> 0 and lo = 0 and sessionid='{$GLOBALS['phpgw']->session->sessionid}' limit 1",__LINE__,__FILE__);
-   $GLOBALS['phpgw']->db->next_record( );
-   $_SESSION['connection_db_info']['user_auth'] = $GLOBALS['phpgw']->db->row( );
-}

Removido também nos arquivos de instalação [2852].

comment:14 Changed 10 years ago by niltonneto

A versão do header.inc.php foi incrementada em [2854] para forçar atualização do mesmo, e remover automaticamente as linhas de código comentadas acima.

comment:15 Changed 10 years ago by niltonneto

Corrigido no Trunk [2855][2856].

comment:16 follow-up: ↓ 17 Changed 10 years ago by niltonneto

Durante homologação (e atualização em alguns servidores de produção) da validação por IP foi detectado problema ao forçar logout do usuário, quando a sessão for inválida:

[Mon May 31 10:00:30 2010] [error] [client 127.0.0.1] [ INVALID SESSION ] .....
[Mon May 31 10:00:30 2010] [error] [client 127.0.0.1] PHP Fatal error:  Cannot redeclare perfgetmicrotime() .....

Corrigido em [2885]

comment:17 in reply to: ↑ 16 Changed 10 years ago by niltonneto

Replying to niltonneto:

Durante homologação (e atualização em alguns servidores de produção) da validação por IP foi detectado problema ao forçar logout do usuário, quando a sessão for inválida:

[Mon May 31 10:00:30 2010] [error] [client 127.0.0.1] [ INVALID SESSION ] .....
[Mon May 31 10:00:30 2010] [error] [client 127.0.0.1] PHP Fatal error:  Cannot redeclare perfgetmicrotime() .....

Corrigido em [2885]

Replicado no Trunk [2909].

comment:18 Changed 10 years ago by niltonneto

Reutilizada configuração "Verificar endereço IP de todas sessões" existente em Configurações do Servidor do Administrador. Desta forma, a validação de sessão não utiliza mais o IP do usuário na composição de sua string, quando essa opção estiver desabilitada. Corrigido no Trunk [2910], replicado no Branch 2.0 [2911].

comment:19 Changed 10 years ago by niltonneto

  • Status changed from new to closed
  • Resolution set to fixed
Note: See TracTickets for help on using tickets.