International PHP Conference Berlin 2025

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';
}
?>
add a note

User Contributed Notes 2 notes

up
13
Anonymous
10 years ago
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
up
1
cornernote [at] gmail.com
9 years ago
clean input of null bytes:

<?php
$clean
= str_replace(chr(0), '', $input);
?>
To Top