PHP 7.0.33 Released

Boş baytlı girdiler

PHP, dosya sistemi ile ilgili işlemler için kod seviyesinde C işlevlerini kullandığından boş baytlı (\0) dizgeler beklenmedik davranışlara yol açabilir. Boş bayt, C'de dizgeleri sonlandırmak için kullanıldığından boş bayt içeren dizgelerin tamamı değil, boş bayta kadar olan bölüm işleme sokulur. Aşağıdaki örnekte bunun sebep olduğu bir sorun ele alınmıştır:

Örnek 1 - Boş baytlardan olumsuz etkilenen bir betik

<?php
$dosya 
$_GET['dosya']; // "../../etc/passwd\0"
if (file_exists('/home/siteler/'.$dosya.'.php')) {
    
/* /home/siteler/../../etc/passwd mevcut olduğundan
       file_exists işlevi TRUE döndürür */
    
include '/home/siteler/'.$dosya.'.php';
    
// /etc/passwd dosyası betiğe dahil edildi
}
?>

Bu bakımdan, bir dosya sistemi işleminde kullanılan her dizge daima denetlenmelidir. Aşağıda, önceki örneğin iyileştirilmişi verilmiştir:

Örnek 2 - Girdiyi doğru şekilde ele almak

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

// Kabul edilebilir değerlerin listesi
switch ($file) {
    case 
'main':
    case 
'foo':
    case 
'bar':
        include 
'/home/siteler/include/'.$dosya.'.php';
        break;
    default:
        include 
'/home/siteler/include/main.php';
}
?>
add a note add a note

User Contributed Notes 3 notes

up
9
Anonymous
4 years ago
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
up
5
J.D. Grimes
4 years ago
This issue has been fixed for file_exists(): https://bugs.php.net/bug.php?id=39863

It still exists for include|require(_once) as of this writing.
up
2
cornernote [at] gmail.com
3 years ago
clean input of null bytes:

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