Issue lors de l'utilisation des octets nuls

Comme PHP utilise des fonctions C pour les opérations sous-jacentes, notamment au niveau du système de fichiers, il peut gérer les octets nuls d'une façon inattendue. Sachant que les octets nuls dénotent la fin d'une chaîne de caractères en C, certaines fonctions vont donc considérer ces chaînes jusqu'à la première occurrence d'un octet nul. L'exemple suivant présente un code vulnérable qui montre ce problème :

Exemple #1 Script vulnérable aux octets nuls

<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
   // file_exists retournera true sachant que le fichier /home/wwwrun/../../etc/passwd existe
   include '/home/wwwrun/'.$file.'.php';
   // le fichier /etc/passwd sera inclu
}
?>

Ainsi, toute chaîne utilisée dans des opérations sur le système de fichiers doit toujours être validée proprement. Voici une meilleure solution de l'exemple précédent :

Exemple #2 Validation correcte de l'entrée

<?php
$file = $_GET['file'];

// Whitelisting possible values
switch ($file) {
   case 'main':
   case 'foo':
   case 'bar':
   include '/home/wwwrun/include/'.$file.'.php';
   break;
   default:
   include '/home/wwwrun/include/main.php';
}
?>
LoadingChargement en cours