## Problèmes liés aux 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 inclus
    }
    ?>

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'];

    // Liste blanche des valeurs possibles
    switch ($file) {
       case 'main':
       case 'foo':
       case 'bar':
       include '/home/wwwrun/include/' . $file . '.php';
       break;
       default:
       include '/home/wwwrun/include/main.php';
    }

    ?>

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open