Disinfetta i parametri $ _GET per evitare XSS e altri attacchi

Ho un sito Web in PHP che include () per incorporare il contenuto in un model. La pagina da caricare è data in un parametro get, aggiungo ".php" alla fine del parametro e includo quella pagina. Devo fare un controllo di sicurezza per evitare XSS o altre cose (non mysql injection dato che non abbiamo un database). Quello che ho scoperto è il seguente.

$page = $_GET['page']; if(!strpos(strtolower($page), 'http') || !strpos($page, '/') || !strpos($page, '\\') || !strpos($page, '..')) { //append ".php" to $page and include the page 

C'è qualche altra cosa che posso fare per sanificare ulteriormente il mio input?

 $page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']); 

È probabilmente il modo più rapido per disinfettare questo, questo richiederà qualsiasi cosa e farà in modo che contenga solo lettere, numbers, trattini bassi o trattini.

Non "disinfettare": gli attacchi sono specifici per l'uso dei dati, non della fonte. Esci dai valori mentre li emetti invece. Vedi anche la mia risposta a Qual è il miglior metodo per sanitizzare l'input dell'utente con PHP?

Definisci un elenco esplicito di pagine che hai nel tuo codice sorgente e poi usalo per verificare l'input. Sì, è più lavoro, ma rende molto chiaro cosa è permesso e cosa no. Per esempio:

 $AVAILABLE_PAGES = arrays('home', 'news', ...); $AVAILABLE_PAGES = arrays_fill_keys($AVAILABLE_PAGES, 1); $page = $_GET['page']; if (!$AVAILABLE_PAGES[$page]) { header("HTTP/1.0 404 Not Found"); die('Page not found.'); } include "pages/$page.php";