Ticket #1244 (closed defeito: fixed)

Opened 9 years ago

Last modified 9 years ago

Acesso ao home.php gera inúmeras requisições a uma página desconhecida do expresso

Reported by: diogenesduarte Owned by: diogenesduarte
Priority: normal Milestone: Expresso 2.2
Component: ExpressoMail Version: branch 2.2
Severity: média Keywords:
Cc: WorkGroup: Gestão de Segurança

Description

Requisições feitas a partir do I.E 8 dentro do windows 7 à pagina home.php do expresso faz com que o navegador fique fazendo, sem parar, requisições para o servidor de forma que degrada a rede e entope o log do servidor web.

Esse problema corresponde ao discutido no fórum no link: http://www.expressolivre.org/html/modules/newbb/viewtopic.php?topic_id=1729&forum=5#threadbottom

Change History

comment:1 Changed 9 years ago by diogenesduarte

  • Owner changed from alguem to diogenesduarte

comment:2 Changed 9 years ago by diogenesduarte

  • Status changed from new to closed
  • Resolution set to fixed

Retirada a linha que gera esses logs na revisão [3382].

comment:3 Changed 9 years ago by niltonneto

  • WorkGroup set to Gestão de Segurança

Nossa, sério que era só isso? Vou ativar o MultiViews? aqui e testar novamente pra ver....

comment:4 Changed 9 years ago by diogenesduarte

Sério sim, era só isso... Aqui na PRODEB a gente nem resolveu desativando o multiviews, removemos esse código e o log agradeceu...

comment:5 Changed 9 years ago by niltonneto

Diogenes, não funcionou. Acho que aí também vai dar problema ainda. Faça o seguinte teste: Entre pelo IE8, e sem se logar, digite o endereço do teu expresso + /home/

comment:6 follow-up: ↓ 7 Changed 9 years ago by niltonneto

  • Status changed from closed to reopened
  • Resolution fixed deleted

Opa, acho que encontrei a explicação. Só resta solucioná-lo agora. Vamos lá:

Sobre a revisão [3382], o código que você removeu pode solucionar parcialmente o problema para usuários logados no Expresso. Mas a linha anterior possui o mesmo problema. Isso acontece porque as variáveis {img_shortcut} e {img_icon} possuem um caminho das imagens para "/home/templates/default/images/", que é populado na API através de uma variável definida (PHPGW_IMAGES_DIR). E aí é que está o problema.

O método get_image_path() da classe "common" (phpgwapi/inc) retorna esse caminho quando o suposto módulo carregado é a página inicial. Isso acontece porque não está levando em consideração que "home" não é um módulo, quando na verdade, deveria ignorá-lo e deixar sem nada. Para os demais módulos está correto.

Enfim, tudo aliado à interpretação da Diretiva "MultiViews?". Ela faz com o que o caminho "/home/" seja interpretado como "/home.php/", gerando o loop. E o loop, é consequência do caracter "/" passado após o "home.php". Não sei porque motivo ele faz isso.

Resumindo a ópera:

1 - O método get_image_path() retorna o caminho errado quando é página inicial; 2 - O Apache pelo MultiViews? interpreta "/home/" como sendo "/home.php/" e executa; 3 - O home.php contendo "/" na URL gera o loop infinito e não sei por que disso.

O que fazer: 1 - Alterar todos métodos da API, que montam caminhos conforme o módulo clicado, para que desconsiderem quando for "home" (página inicial);

2 - Desabilitar o MultiViews? (mod_negociation do Apache) para não interpretar scripts PHP sem a extensão ".php";

3 - Verificar por que quando é passdo o "/" após o home.php gera loop infinito.

comment:7 in reply to: ↑ 6 Changed 9 years ago by diogenesduarte

É, realmente podemos fazer tudo isso... Ou... mudar a linha 23 do arquivo home.php de Header('Location: login.php?cd=10'); para Header('Location: /login.php?cd=10');

de forma mágica, tudo funciona, risos...

Testa aí para ver se estou certo... O problema é o encaminhamento... Ele está encaminhando em home para /home/login.php?cd=10 por não estar logado, e o internet explorer 8 burro que só ele, sabe que a página não existe e continua chamando!! colocando a / na frente ele encaminha certinho, risos...

Replying to niltonneto:

Opa, acho que encontrei a explicação. Só resta solucioná-lo agora. Vamos lá:

Sobre a revisão [3382], o código que você removeu pode solucionar parcialmente o problema para usuários logados no Expresso. Mas a linha anterior possui o mesmo problema. Isso acontece porque as variáveis {img_shortcut} e {img_icon} possuem um caminho das imagens para "/home/templates/default/images/", que é populado na API através de uma variável definida (PHPGW_IMAGES_DIR). E aí é que está o problema.

O método get_image_path() da classe "common" (phpgwapi/inc) retorna esse caminho quando o suposto módulo carregado é a página inicial. Isso acontece porque não está levando em consideração que "home" não é um módulo, quando na verdade, deveria ignorá-lo e deixar sem nada. Para os demais módulos está correto.

Enfim, tudo aliado à interpretação da Diretiva "MultiViews?". Ela faz com o que o caminho "/home/" seja interpretado como "/home.php/", gerando o loop. E o loop, é consequência do caracter "/" passado após o "home.php". Não sei porque motivo ele faz isso.

Resumindo a ópera:

1 - O método get_image_path() retorna o caminho errado quando é página inicial; 2 - O Apache pelo MultiViews? interpreta "/home/" como sendo "/home.php/" e executa; 3 - O home.php contendo "/" na URL gera o loop infinito e não sei por que disso.

O que fazer: 1 - Alterar todos métodos da API, que montam caminhos conforme o módulo clicado, para que desconsiderem quando for "home" (página inicial);

2 - Desabilitar o MultiViews? (mod_negociation do Apache) para não interpretar scripts PHP sem a extensão ".php";

3 - Verificar por que quando é passdo o "/" após o home.php gera loop infinito.

comment:8 Changed 9 years ago by niltonneto

Opa, então, analisando o "home.php", o seguinte código está gerando o loop:

if (!isset($GLOBALS['sessionid']) || !$GLOBALS['sessionid'])
{						
Header('Location: login.php?cd=10');		
exit;
}

Se removermos a linha contendo "exit", funciona normalmente e o loop não acontece. Mas não concordo em fazer isso, visto q o "exit" tem sua função e não deveria influenciar na questão do redirecionamento. Nas versões mais antigas (versão Expresso 1.2) esse loop infinito também acontece no IE.

comment:9 follow-up: ↓ 10 Changed 9 years ago by diogenesduarte

Joga a "/" na frente pow, ele vai direcionar para login.php na raiz... resolve!!! e joga / também na linha de cima em setup...

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

Replying to diogenesduarte:

Joga a "/" na frente pow, ele vai direcionar para login.php na raiz... resolve!!! e joga / também na linha de cima em setup...

Essa solução não é muito boa. É preciso concatenar o contexto utilizado e não somente "/". Dessa forma gera erro quando o expresso está em contexto diferente do root do Apache. Aqui na estação de desenvolvimento, tenho por exemplo, localhost/expresso-2.0, localhost/expresso-2.2, etc....

comment:11 Changed 9 years ago by diogenesduarte

Ahn, mas isso é muito específico em um ambiente de testes... e ninguém no ambiente de testes vai ficar digitando url/home/... Será que vale a pena nos preocuparmos com isso?

comment:12 follow-up: ↓ 14 Changed 9 years ago by niltonneto

Você que se engana. Muita gente usa por aí em portais, intranet, etc, o expresso como contexto.

comment:13 Changed 9 years ago by niltonneto

O correto seria usar $GLOBALSphpgw_info?server?webserver_url? , mas como header.inc.php é chamado depois, terei que implementar de outra forma, usando $_SERVER.

comment:14 in reply to: ↑ 12 ; follow-up: ↓ 15 Changed 9 years ago by diogenesduarte

Verdade... Mas com o / o que vai acontecer com elas é que vai aparecer como página inexistente o /home/, tou errado? Acho que o log não vai ser afetado. E quanto a usar $_SERVER, tem alguma posição que retorne o valor que a gente quer?

Replying to niltonneto:

Você que se engana. Muita gente usa por aí em portais, intranet, etc, o expresso como contexto.

comment:15 in reply to: ↑ 14 Changed 9 years ago by niltonneto

Replying to diogenesduarte:

Verdade... Mas com o / o que vai acontecer com elas é que vai aparecer como página inexistente o /home/, tou errado? Acho que o log não vai ser afetado. E quanto a usar $_SERVER, tem alguma posição que retorne o valor que a gente quer?

Replying to niltonneto:

Você que se engana. Muita gente usa por aí em portais, intranet, etc, o expresso como contexto.

Correto, Diogenes. Mas eu acho mais elegante direcionar para a página de login do Expresso.

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

Então, nenhum valor do $_SERVER retorna somente o contexto da aplicação. O máximo que tem é o valor do contexto mais o nome do script invocado. O bom é que mesmo colocando sem extensão, ele sempre vai retornar o nome do arquivo "home.php". Diogenes, testa isso:

$current_url = substr($_SERVER["SCRIPT_NAME"], 0, strpos($_SERVER["SCRIPT_NAME"],'home.php'));
Header('Location: '.$current_url.'login.php?cd=10');

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

Replying to niltonneto:

Então, nenhum valor do $_SERVER retorna somente o contexto da aplicação. O máximo que tem é o valor do contexto mais o nome do script invocado. O bom é que mesmo colocando sem extensão, ele sempre vai retornar o nome do arquivo "home.php". Diogenes, testa isso:

$current_url = substr($_SERVER["SCRIPT_NAME"], 0, strpos($_SERVER["SCRIPT_NAME"],'home.php'));
Header('Location: '.$current_url.'login.php?cd=10');

E aí Diogenes, poderia testar pra mim? Obrigado!

comment:18 Changed 9 years ago by diogenesduarte

Claro, testo sim, isso deve funcionar... Estou só terminando umas coisas aqui, assim que acabar eu faço isso e comito, se preocupa não!!

comment:19 follow-up: ↓ 20 Changed 9 years ago by niltonneto

Isso, comite se der certo. Muito Obrigado!

comment:20 in reply to: ↑ 19 Changed 9 years ago by diogenesduarte

Funcionou beleza... aproveitamos eu colocamos também para quando redirecionar para setup caso o header.inc não exista, e também no arquivo index.php, pois se chamasse /index/ dava o mesmo problema... comit feito na revisão [3435].

ps: comitei errado o código em [3434], descartem essa revisão...

Replying to niltonneto:

Isso, comite se der certo. Muito Obrigado!

comment:21 follow-up: ↓ 22 Changed 9 years ago by niltonneto

Para ver o diff antes e depois de toda esta conversa  clique aqui

Pô Diogenes, você comentou errado o commit [3435]! Inseriu o número do ticket errado da descrição da revisão. Eu vou corrigir pelo trac-admin, não precisa fazer nada aí.

comment:22 in reply to: ↑ 21 Changed 9 years ago by diogenesduarte

Foi mal, foi a agonia de final de tarde do ultimo dia antes do feriadão, vou me policiar mais da próxima vez...

Replying to niltonneto:

Para ver o diff antes e depois de toda esta conversa  clique aqui

Pô Diogenes, você comentou errado o commit [3435]! Inseriu o número do ticket errado da descrição da revisão. Eu vou corrigir pelo trac-admin, não precisa fazer nada aí.

comment:23 Changed 9 years ago by diogenesduarte

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