La regola fondamentale è che si controlla sempre l'input/output e vedere cosa si può e non può controllo (e quindi, cosa può essere controllato da un utente). Sulla base di ciò, si applicano misure di sicurezza/sanitizzazione.
Se comprendo correttamente lo scenario, viene visualizzata la pagina, a meno che un utente non abbia effettuato l'accesso.In tal caso, viene visualizzata una casella di accesso e, dopo aver effettuato correttamente il login, l'utente torna alla pagina che stava tentando di visitare utilizzando lo $_SERVER['request_uri']
(memorizzato in una sessione).
Quindi l'utente ovviamente può controllare questa variabile, può sfogliare la tua pagina con alcuni caratteri scomodi. Quindi è necessario disinfettarlo. Come @Wayne menziona nei commenti, gli utenti possono attraversare l'albero delle directory, ad esempio.
Pertanto, come le vostre variabili $_GET
, è necessario disinfettare anche lo $_SERVER['request_uri']
. Ci sono molti modi per farlo. Il più sicuro è probabilmente per verificare se request_uri
è una pagina esistente, dopo aver disinfettato con html_entities()
o qualcosa del genere. Si noti che i metodi di attraversamento delle directory speciale come ../
, //
e ./
potrebbe scivolare attraverso metodi convenzionali sanization come il suddetto html_entities()
E per rispondere alla lettera: Devo scappare qualcosa in qualche modo da qualche parte lungo il processo? - Sì, tutto, all'inizio di ogni processo.
------ EDIT @ 2013/12/12 -----
(troppo a lungo una risposta per un commento, quindi mi expain qui come potenzialmente un utente può utilizzare directory . attraversamento, compresa potenziali situazioni di pericolo)
dal manuale di PHP:
$_SERVER['REQUEST_URI']: The URI which was given in order to access this page;
for instance, '/index.html'.
Quindi, dire che voglio andare a yourdomain.com/posts/post.php?../../../ssh
tua webapp noterà che io non sono collegato, negozio post.php?../../../ssh
in una sessione e processo accesso, dopo di che mi rimanda all'URL. A causa della parte ../../../ssh
, non verrà inviata a post.php, ma a una directory sul server denominata ssh
che si trova sotto il webroot. Per tua comodità hai memorizzato le tue chiavi SSH lì. Questo sembra sicuro, perché è fuori dal webroot che nessun utente web dovrebbe essere in grado di accedervi. Tuttavia, posso a causa della mia aggiunta geniale al tuo URL.
Anche se questo è un po 'inverosimile, un ambiente di chroot, un ambiente di chroot configurato correttamente, impedirà questo, questo esempio mostra che se si consente l'aggiunta di questi caratteri, potrebbero far sì che gli utenti accedano ai percorsi. non dovrebbero
A seconda dell'implementazione, aggiungere ciecamente $_SERVER['request_uri']
potrebbe anche significare che roba indesiderata viene aggiunta a una sessione e se la si archivia in un database, verrà aggiunta al database. Non sono realmente aggiornato su come sia (in) sicuro il PHP, ma posso immaginare che questo permetta di scomporre le variabili di sessione e potenzialmente di iniettare cose nel tuo database.
Anche se non tutto è possibile e l'esempio potrebbe non essere realmente possibile, è meglio e non è difficile impedire questo comportamento.
- Piccolo dopo il pensiero: forse la roba header('location'...
non è sicura, ma questo: Is this PHP redirect insecure? mostra il suo non proprio. Tuttavia, come dice un commentatore: non è così difficile digitare urlencode()
Suppongo che al di là di voi significhi oltre l'attraversamento di directory. IE myserver.com/somesite.php?somevar=10/../../../ – Wayne
@Wayne: Il reindirizzamento con un'intestazione 'location' non altera il rischio di attraversamento di directory. Se un utente stava provando questo tipo di attacco, potrebbe facilmente immettere '../../' etc nella barra degli indirizzi direttamente piuttosto che fare affidamento su 'location' per inviare il browser lì. – SilverlightFox