2011-02-01 5 views
7

ho un problema che non ho mai incontrato prima e penso che abbia qualcosa a che fare con la configurazione di apache, che non sono molto esperto.apache: le dieresi sfuggite nella stringa di query (URL) portano a 403

prima, c'è uno script php con un modulo di ricerca. il modulo viene trasmesso tramite POST.

quindi c'è l'elenco dei risultati di risultati di ricerca. qui la query di ricerca originale viene passata come parte dell'URL, ad esempio: search.php? id = 1234 & query = foo. questo funziona anche - fino a quando non ci sono umlaut (äöüÄÖÜß ...) caratteri trasmessi.

appena includo dieresi nella query di ricerca, la prima parte che trasmette la stringa di query come funziona il POST, ma passarlo (urlencoded) nell'URL porta ad una 403.

così:

  • search.php?id=1234&query=bar funziona
  • search.php?id=1234&query=b%E4r porta a 403 (% E4 = "a" utf-8 urlencoded)
  • search.php?id=1234&query=b%C3%A4r porta a 403 (% C3% A4 = "a" utf-8 urlencoded)
  • presentazione dieresi via posta funziona

ho convertito l'applicazione da iso-8859-1 a UTF-8, ma che ha fatto alcuna differenza.

l'ho anche testato sul mio computer locale, qui funziona perfettamente - come previsto.

configurazione remota del server (in cui non funziona):

Apache/2.2.12 (Ubuntu),
PHP versione 5.2.10-2ubuntu6.7, Suhosin Patch 0.9.7, via CGI/FastCGI

configurazione locale (qui le stesse opere):

Apache/2.2.8 (Win32) PHP/5.3.5
Versione PHP 5 .3.5 tramite mod_php

qualcuno ha un idea del perché l'apache/php-cgi remoto non accetta dieresi correttamente urlencoded nel URL?

informazioni aggiuntive: ho anche provato a creare un file statico con una umlaut nel suo nome, ed entrambi /t%C3%A4st.php e /täst.php vengono serviti senza problemi. täst.php?foo=täst non riesce.

nota: ?foo=%28, dove% 28 è "(", funziona anche

+0

pedante, lo so, ma "ß" non ha dieresi ... – Stephen

+0

scusa :) come si chiama questo superset di tipo di caratteri speciali? – stefs

+2

hai qualche modulo mod_security-like con alcune regole infranti? questo succede anche con qualsiasi carattere non-ascii come àéù? – arnaud576875

risposta

1

Apache non sfugge che, il browser non

È necessario utilizzare urlencode e urldecode per evitare problemi con questo.. tipo di caratteri

Alcuni browser, come il vecchio Netscape, inviano l'url come scritto, con caratteri a 8 bit.Altri, in particolare MSIE, codifica l'url come UTF-8 prima di inviarlo al server Web, quindi un carattere a 8 bit arriva come due caratteri, di cui il primo ha l'ottavo bit impostato. Non c'è alcuna indicazione, nelle intestazioni di richiesta o altrove, che l'url sia codificato in UTF-8.

+0

ne sono consapevole. ma ho il sospetto che alcune mod di configurazione di apache/mod configurate in modo errato per bloccare le richieste se ci sono determinati caratteri nell'URL. – stefs

+0

L'altro problema è che urldecode dovrebbe essere eseguito automaticamente in php, quindi questo non dovrebbe causare problemi, come se il server con un 403 dovesse essere apache, se fosse entrato in php e l'errore fosse 500, 403 diciamo che apache non riesce a caricare il file come con le stringhe questa deve essere una regola che viene impostata sul server Apache –

Problemi correlati