Sanitizar os parâmetros $ _GET para evitar XSS e outros ataques

Eu tenho um site no php que inclui () para incorporar o conteúdo em um modelo. A página para carregar é dada em um parâmetro get, eu acrescento “.php” ao final do parâmetro e incluo essa página. Eu preciso fazer uma verificação de segurança para evitar XSS ou outras coisas (não injeção mysql, já que não temos um database). O que eu criei é o seguinte.

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

Existe outra coisa que eu possa fazer para sanitizar minha contribuição?

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

É provavelmente a maneira mais rápida de desinfetar isso, isso vai levar qualquer coisa e certifique-se de que ele contém apenas letras, números, sublinhados ou traços.

Não “sanitizar” – Os ataques são específicos para o uso de dados, e não a fonte. Escape de valores à medida que você os emite. Veja também a minha resposta para o que é o melhor método para desinfetar a input do usuário com o PHP?

Defina uma lista explícita de páginas que você possui no seu código-fonte e depois use-a para verificar a input. Sim, é mais trabalho, mas deixa muito claro o que é permitido e o que não é. Por exemplo:

 $AVAILABLE_PAGES = array('home', 'news', ...); $AVAILABLE_PAGES = array_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";