PHP 8.1.31 Released!

Problemas relacionados a 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';
}

?>
adicione uma nota

Notas Enviadas por Usuários (em inglês) 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