Seguridad del Sistema de Archivos
PHP Manual

Cuestiones relacionadas a bytes nulos

Como PHP utiliza las funciones de C para operaciones relacionadas al sistema de archivos, se podría manejar bytes nulos de manera bastante inesperada. Como un byte nulo denota el fin de una cadena en C, las cadenas que contengan estos no serán consideradas por completo, sino sólo hasta que ocurra un byte nulo. El siguiente ejemplo muestra un código vulnerable que presenta este problema:

Ejemplo #1 Script vulnerable a bytes nulos

<?php
$file 
$_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
    
// file_exists devolverá true si el archivo /home/wwwrun/../../etc/passwd existe
    
include '/home/wwwrun/'.$file.'.php';
    
// el archivo /etc/passwd se incluirá
}
?>

Por lo tanto, cualquier cadena que se utiliza en una operación de sistema de archivos siembre deben ser validados correctamente. He aquí una versión mejorada del ejemplo anterior:

Ejemplo #2 Validando correctamente la entrada

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

// Lista blanca de valores posibles
switch ($file) {
    case 
'main':
    case 
'foo':
    case 
'bar':
        include 
'/home/wwwrun/include/'.$file.'.php';
        break;
    default:
        include 
'/home/wwwrun/include/main.php';
}
?>

Seguridad del Sistema de Archivos
PHP Manual