Ho esaminato alcuni post di newsgroup su PHP Internals e ho trovato un'interessante discussione sull'argomento. Il thread iniziale riguardava qualcos'altro, ma un'osservazione di Stefan Esser, un (se non l' esperto) di sicurezza nel mondo PHP, ha rivolto la discussione alle implicazioni sulla sicurezza dell'uso di $ _REQUEST per alcuni post.
Citando Stefan Esser su PHP Internals
$ _REQUEST è uno dei maggiori punti deboli del design in PHP. Ogni applicazione che utilizza $ _REQUEST è molto probabilmente vulnerabile a problemi di falsificazione di richieste cross-site ritardate. (Questo in pratica significa che se ad es. Un cookie denominato (età) esiste, sovrascriverà sempre il contenuto GET / POST e quindi verranno eseguite richieste indesiderate)
e in una successiva risposta allo stesso thread
Non si tratta del fatto che qualcuno possa falsificare GET, POST; Variabili COOKIE. Riguarda il fatto che i COOKIE sovrascriveranno i dati GET e POST in REQUEST.
Pertanto potrei infettare il tuo browser con un cookie che dice ad esempio action = logout e da quel giorno non potrai più utilizzare l'applicazione perché REQUEST [action] sarà disconnesso per sempre (fino a quando non cancellerai manualmente il cookie).
E infettarti con un COOKIE è così semplice ...
a) Potrei usare un vuln XSS in qualsiasi applicazione su un sottodominio
b) Hai mai provato a impostare un cookie per * .co.uk o * .co.kr quando possiedi un singolo dominio lì?
c) Altri cross domain in qualunque modo ...
E se credi che questo non sia un problema, posso dirti che esiste una semplice possibilità di impostare fe un cookie * .co.kr che si traduce in diverse versioni di PHP che restituiscono solo pagine bianche. Immagina: un solo cookie per eliminare tutte le pagine PHP in * .co.kr
E impostando un ID di sessione illegale in un cookie valido per * .co.kr in una variabile chiamata + PHPSESSID = illegale puoi ancora eseguire il DOS su tutte le applicazioni PHP in Corea usando sessioni PHP ...
La discussione continua per qualche altro post ed è interessante da leggere.
Come puoi vedere, il problema principale con $ _REQUEST non è tanto che ha dati da $ _GET e $ _POST, ma anche da $ _COOKIE. Alcuni altri ragazzi nell'elenco hanno suggerito di cambiare l'ordine in cui $ _REQUEST viene riempito, ad esempio riempendolo con $ _COOKIE prima, ma questo potrebbe portare a numerosi altri potenziali problemi, ad esempio con la gestione della sessione .
Tuttavia, potresti omettere completamente $ _COOKIES dalla $ _REQUEST globale, in modo che non venga sovrascritto da nessuno degli altri array (in effetti, puoi limitarlo a qualsiasi combinazione dei suoi contenuti standard, come il manuale PHP sull'impostazione variable_order ini ci dice:
variabile_ordine Imposta l'ordine di analisi delle variabili EGPCS (Environment, Get, Post, Cookie e Server). Ad esempio, se variable_order è impostato su "SP", PHP creerà i superglobali $ _SERVER e $ _POST, ma non $ _ENV, $ _GET e $ _COOKIE. L'impostazione su "" significa che non verrà impostata alcuna superglobale.
Ma poi di nuovo, potresti anche considerare di non utilizzare $ _REQUEST del tutto, semplicemente perché in PHP puoi accedere a Environment, Get, Post, Cookie e Server nei loro globali e avere un vettore di attacco in meno. Devi ancora disinfettare questi dati, ma è una cosa in meno di cui preoccuparti.
Ora potresti chiederti, perché dopo tutto $ _REQUEST esiste e perché non è stato rimosso. Questo è stato chiesto anche su PHP Internals. Citando Rasmus Lerdorf su Perché esiste $ _REQUEST? su PHP Internals
Più cose come questa rimuoviamo, più difficile diventa per le persone passare rapidamente a versioni più nuove, più veloci e più sicure di PHP. Ciò causa molta più frustrazione per tutti rispetto a poche "brutte" funzionalità legacy. Se c'è una ragione tecnica, prestazioni o sicurezza decente, allora dobbiamo esaminarla attentamente. In questo caso, la cosa che dovremmo guardare non è se dobbiamo rimuovere $ _REQUEST ma se dobbiamo rimuovere i dati dei cookie da esso. Molte configurazioni lo fanno già, comprese tutte le mie, e c'è un motivo di sicurezza valido e valido per non includere i cookie in $ _REQUEST. La maggior parte delle persone usa $ _REQUEST per indicare GET o POST, non rendendosi conto che potrebbe contenere anche cookie e come tali i malintenzionati potrebbero potenzialmente fare alcuni trucchi di iniezione di cookie e rompere le applicazioni ingenue.
Ad ogni modo, spero che faccia luce.