2012-11-29 19 views
5
$num = $_GET['fileid'];      // get file id 

$realfile = "filename".$num.'.txt'; 

Câu hỏi của tôi là vẫn có thể vô hiệu hóa chất độc này? . '. txt' ở cuối không biến mất với việc tiêm byte null theo thử nghiệm của tôi. Có cách nào để null byte này?php null byte injection?

+0

Trong Ext3/4 FS '\ 0' ký tự chỉ bị tước –

+0

Tôi sẽ loại bỏ tất cả các nghi ngờ và chỉ cần xác nhận đầu vào; sử dụng danh sách trắng, sử dụng regex, truyền tới int hoặc bất kỳ điều gì áp dụng tốt nhất. – jeroen

+0

% 00 --- http://ha.ckers.org/blog/20060914/php-vulnerable-to-null-byte-injection/ – user956584

Trả lời

4

Tôi tin rằng mã của bạn có thể dễ bị tấn công tra tấn thư mục - nếu ai đó cung cấp "/../../foo" dưới dạng fileid, thì đường dẫn sẽ là "filename/../../foo.txt", có thể là mục tiêu hợp lệ. Xem: http://en.wikipedia.org/wiki/Directory_traversal

Tôi với @jeroen và @ shiplu.mokadd.im người gợi ý vệ sinh đầu vào của bạn - giả fileid là một con số thì intval() chức năng sẽ làm bạn tốt:

$num = $_GET['fileid']; 
$num = intval($num); 
if($num == 0) { 
    echo "Invalid file ID: Not a number."; 
    exit; 
} else { 
    $fileName = 'filename' . $num . '.txt'; 
    if(!file_exists($fileName)) { 
     echo "Invalid file ID: Doesn't exist."; 
    } else { 
     // do something 
    } 
}