2009-10-19 32 views
12

Tengo un sitio web en php que incluye() para incrustar el contenido en una plantilla. La página para cargar se da en un parámetro get, agrego ".php" al final del parámetro e incluyo esa página. Necesito hacer un control de seguridad para evitar XSS u otras cosas (no inyección de mysql ya que no tenemos una base de datos). Lo que se me ocurrió es lo siguiente.

$page = $_GET['page']; 

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

¿Hay alguna otra cosa que pueda hacer para sanitizar aún más mi entrada?

+4

No marque el resultado de strpos() así - devolverá cero si la coincidencia está al comienzo de la cadena, que evaluará a falso –

+0

@Tom, la solución aceptada permite yo también lo evito, de todos modos, gracias, recordaré tu consejo para el código futuro. –

+0

Vea también: http://stackoverflow.com/a/15825812/59087 –

Respuesta

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

es probablemente la forma más rápida para desinfectar esto, esto va a tomar cualquier cosa y asegúrese de que sólo contiene letras, números, guiones o guiones.

+1

todavía puede atacar usando código hexadecimal: vea http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to- prevent-sql-injection/12202218 # 12202218 y también http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 –

+2

ambos enlaces son sobre mysql y esto la pregunta no es sobre la inyección sql – NikkyD

3

Defina una lista explícita de las páginas que tiene en su código fuente y luego utilícela para verificar la entrada. Sí, es más trabajo, pero deja muy claro lo que está permitido y lo que no. Por ejemplo:

$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"; 
Cuestiones relacionadas