Ticket #1041 (closed defeito: fixed)
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:3 Changed 14 years ago by niltonneto
- Version changed from trunk to branch 2.0
Replicado no Branch 2.0 [2582]
comment:4 Changed 14 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 14 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 14 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 14 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:9 Changed 14 years ago by niltonneto
- Milestone changed from Expresso 2.0.6 to Expresso 2.0.7
comment:10 Changed 14 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 14 years ago by niltonneto
Corrigido no Branch 2.0 [2850].
comment:12 follow-up: ↓ 13 Changed 14 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 14 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 14 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 14 years ago by niltonneto
comment:16 follow-up: ↓ 17 Changed 14 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 14 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 14 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 14 years ago by niltonneto
- Status changed from new to closed
- Resolution set to fixed
r2522 corrige o problema