Come si configura Apache / PHP per accettare le barre nelle stringhe di query?
-
19-08-2019 - |
Domanda
Ho due server Apache che eseguono PHP. Uno accetta barre rovesciate nella stringa di query e le passa a PHP nel modo previsto, ad esempio:
http://server/index.php?url=http://foo.bar
funziona e in PHP questa espressione è vera:
Ho due server Apache che eseguono PHP. Uno accetta barre rovesciate nella stringa di query e le passa a PHP nel modo previsto, ad esempio:
http://server/index.php?url=http://foo.bar
funziona e in PHP questa espressione è vera:
<*>
Tuttavia, nell'altro altro server Apache, lo stesso URL genera un errore 403 proibito
! Tieni presente che se la stringa di query ha l'escaping corretto dell'URL (ovvero con % 2F
invece di barra), allora tutto funziona.
Chiaramente c'è qualche differenza nella configurazione di Apache o PHP che causa questo, ma non riesco a capire cosa!
Voglio accettare questa forma di URL in entrambi i casi, non rifiutarla.
REQUEST['url'] == "http://foo.bar"
Tuttavia, nell'altro altro server Apache, lo stesso URL genera un errore 403 proibito
! Tieni presente che se la stringa di query ha l'escaping corretto dell'URL (ovvero con % 2F
invece di barra), allora tutto funziona.
Chiaramente c'è qualche differenza nella configurazione di Apache o PHP che causa questo, ma non riesco a capire cosa!
Voglio accettare questa forma di URL in entrambi i casi, non rifiutarla.
Soluzione
http: //server/index.php? url = http: //foo.bar
non è un URL valido. Devi codificare le barre. Penso che i browser lo facciano automagicamente, quindi forse stavi testando con browser diversi?
O forse è l'impostazione AllowEncodedSlashes ?
Altri suggerimenti
Alcuni post suggeriscono che l'utilizzo del PO è errato, il che è falso.
Espandendo il commento di Sam152, le stringhe di query possono contenere entrambe? e / caratteri, vedere la sezione 3.4 di http://www.ietf.org/rfc/rfc3986.txt , che è fondamentalmente la specifica scritta da Tim Berners-Lee e dagli amici che regolano il funzionamento del web.
Il problema è che i parser scritti male (o mal configurati o usati in modo improprio) interpretano le barre della stringa di query come componenti del percorso di separazione.
Ho visto esempi della funzione pathinfo di PHP utilizzata per analizzare gli URL. Pathinfo non è stato scritto per analizzare un URL. È comunque possibile estrarre il percorso utilizzando parse_url, quindi utilizzare fileinfo per recuperare i dettagli dal percorso. Vedrai che parse_url gestisce / e? nelle stringhe di query va bene.
In ogni caso, il problema generale è che quest'area è scarsamente compresa a tutto tondo, anche tra gli sviluppatori esperti, e la maggior parte delle persone (me compreso fino a poco tempo fa) presume semplicemente che qualsiasi cosa dopo il nome del file debba essere urlencoded, che è chiaramente falso se si prendono in considerazione gli standard.
tl; dr Leggi le specifiche :)
Hai mod_security
installato? Vedi questa discussione:
403 Proibito nella pagina PHP chiamato con url codificato in un parametro $ _GET
Nella tua configurazione di Apache:
AllowEncodedSlashes On
Per ulteriori informazioni, consultare la documentazione:
http://httpd.apache.org/docs/2.2/mod/ core.html # allowencodedslashes
Modifica: Hmm, potrebbe essere quello che hai già funzionato ... Ho avuto lo stesso problema, e quello che alla fine ha risolto il problema per me è stato semplicemente usare $ _SERVER ['REQUEST_URI']
dato che aveva i dati di cui avevo bisogno.
Non specifichi cosa fa PHP con questo url. Reindirizza a questa pagina o prova a leggerlo?
Probabilmente esiste una regola mod_rewrite per rimuovere le doppie barre, o per qualche altro scopo, che tenta di reindirizzare questo da qualche parte che non dovrebbe.
Forse una regex senza ^ prima di http: //
Nota che se la stringa della query è correttamente salvata nell'URL (cioè con% 2F anziché barra rovesciata), allora tutto funziona.
Quindi funziona quando la stringa di query è formattata correttamente e non funziona quando non lo è. Qual è il problema?
Sembra un altro caso di default magic_quotes_gpc. Sul server che causa problemi controlla php.ini e assicurati che
magic_quotes_gpc = Off