Ticket #1244 (closed defeito: fixed)
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:2 Changed 14 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 14 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 14 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 14 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 14 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 14 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 14 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 14 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 14 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 14 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 14 years ago by niltonneto
Você que se engana. Muita gente usa por aí em portais, intranet, etc, o expresso como contexto.
comment:13 Changed 14 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 14 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 14 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 14 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 14 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 14 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 14 years ago by niltonneto
Isso, comite se der certo. Muito Obrigado!
comment:20 in reply to: ↑ 19 Changed 14 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 14 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 13 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 13 years ago by diogenesduarte
- Status changed from reopened to closed
- Resolution set to fixed