2009-10-19 5 views
12

J'ai un site web en php qui inclut() pour intégrer le contenu dans un template. La page à charger est donnée dans un paramètre get, j'ajoute ".php" à la fin du paramètre et inclue cette page. Je dois faire une vérification de sécurité pour éviter XSS ou d'autres choses (pas d'injection mysql puisque nous n'avons pas de base de données). Ce que j'ai trouvé est le suivant.

$page = $_GET['page']; 

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

Y at-il autre chose que je peux faire pour désinfecter mon entrée?

+4

Ne pas vérifier le résultat de strpos() comme ça - il retournera zéro si la correspondance est au début de la chaîne, ce qui évaluera à faux –

+0

@Tom, la solution acceppted permet moi aussi j'évite ça, de toute façon merci, je me souviendrai de tes conseils pour le futur code. –

+0

Voir aussi: http://stackoverflow.com/a/15825812/59087 –

Répondre

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

est probablement le moyen le plus rapide pour aseptiser cela, cela prendra quelque chose et assurez-vous qu'il ne contient que des lettres, des chiffres ou des tirets, soulignement.

+1

peut encore attaquer en utilisant le code hexadécimal: voir http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to- prevent-sql-injection/12202218 # 12202218 et aussi http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 –

+2

les deux liens sont sur mysql et ce question n'est pas sur l'injection sql – NikkyD

3

Définissez une liste explicite de pages que vous avez dans votre code source, puis utilisez-la pour vérifier l'entrée. Oui, c'est plus de travail, mais cela rend très clair ce qui est permis et ce qui ne l'est pas. Par exemple:

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

Ne pas "assainir" - Les attaques sont spécifiques à l'utilisation des données, pas à la source. Échappez les valeurs lorsque vous les affichez à la place. Voir aussi ma réponse à What’s the best method for sanitizing user input with PHP?

+0

Je l'ai lu, mais je ne pense pas que cela correspond au site sur lequel je travaille. –

Questions connexes