## Problemas relacionados aos bytes nulos (NUL)

Como o PHP usa funções em C para operações relacionadas ao sistema de arquivos, ele pode lidar com bytes nulos de maneira inesperada. Como bytes nulos denotam fim de string em C, strings que os contém não serão consideradas de forma inteira, mas apenas até que um byte nulo ocorra. O seguinte exemplo mostra um código vulnerável que demonstra esse problema:

Exemplo #1 Script vulnerável a bytes nulos

    <?php

    $file = $_GET['file']; // "../../etc/passwd\0"

    if (file_exists('/home/wwwrun/' . $file. '.php')) {
        // file_exists retornará true porque o arquivo /home/wwwrun/../../etc/passwd existe
        include '/home/wwwrun/' . $file . '.php';
        // o arquivo /etc/passwd será incluído

    }

    ?>

Portanto, qualquer string comprometida que é usada em uma operação de sistema de arquivos deve sempre ser validada corretamente. Aqui está uma versão melhorada do exemplo anterior:

Exemplo #2 Validando entrada corretamente

    <?php

    $file = $_GET['file'];

    // Autorizando valores possíveis
    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