2013-08-15 2 views
0

Я занят кодирования PHP-файл для безопасного загрузки файлов изображений, таких как .jpg, .jpeg, .png, .bmp и .gifЯвляется ли это регулярное выражение уязвимым для произвольной загрузки файла?

Вот код:

$realname = $_FILES['userfile']['name']; 

if(!preg_match("/(\.jpg|\.png|\.gif|\.bmp|\.jpeg)$/i",$realname)) { 
      die(); 
} 

ли есть способ обойти эту проверку, чтобы загрузить файл .php? Я слышал о трюке file.php% 00.jpg, но это защищено. Кто-нибудь знает какие-либо другие методы? Или безопасный код?

+4

Поскольку расширения файлов бессмысленны, проверьте фактический тип файла –

+0

уверен, 'ren nastyvirus.php cutekittens.jpg' и от вас. К счастью, большинство серверов не обрабатывают файлы .jpg как скрипты PHP, поэтому исходный код будет просто отправлен клиенту, в отличие от файла php, который будет выполнен. Никогда не основывайте решения о безопасности на том, что предоставил пользователь. использовать определение типа файла на стороне сервера, например. fileinfo, чтобы увидеть, действительно ли это изображение, или просто что-то ПРЕДСТАВЛЕННОЕ, чтобы быть изображением. –

+0

@Dagon Сервер использует расширение имени файла, чтобы решить, как обрабатывать файл. Вы можете вставлять PHP-код в совершенно корректный файл изображения, поэтому лучше не допускать '.php'. – Gumbo

ответ

0

Чтобы ответить на вопрос: да.

Но вам повезло, я просто написал:

function checkImageFileIsImage($filepath) { 
    $type = exif_imagetype($filepath); 
    $allowedTypes = array(
     1, // [] gif 
     2, // [] jpg 
     3 // [] png 
    ); 

    if (!in_array($type, $allowedTypes)) { 
     return false; 
    } 
    return true; 
} 

Взгляните на http://php.net/manual/en/function.exif-imagetype.php большего количества типов файлов.

+0

Спасибо за ответ, но вы могли бы привести пример того, как мой код может быть обойден? Это поможет мне узнать больше. – John

+0

Ни код Джона, ни Грим не являются «безопасными» - http://php.webtutor.pl/en/2011/05/13/php-code-injection-a-simple-virus-written-in-php-and-carried -in-a-jpeg-image/ – symcbean

+0

@symcbean Спасибо, это интересно. Использование GD для копирования копии изображения вокруг этой проблемы. –