|
|
|
| Всем привет, вот собрал все известные мне методы проверок загрузки файлов на сервер. Хотел бы узнать стоит ли их использовать все вместе для большей надежности от заливки эксплойта. Может я что-то еще не учел? Жду критики и пожеланий. Как вообще по максимуму защитится? Спасибо.
$error = 0;
$file = $_FILES['foto']['type'];
$file_type = substr($file, 0, 5);
$image_type = mime_content_type($file);
$allowed_files = array("image/gif", "image/png", "image/jpeg", "image/pjpeg");
//1-я проверка
if($file_type != "image"){
$error++;
}
//2-я проверка
if (!in_array($file, $allowed_files){
$error++;
}
//3-я проверка
if (!in_array($image_type, $allowed_files){
$error++;
}
if($error == 0){
echo "Загружаем файл";
}
|
П.С. В догонку хочу спросить какой mime тип файлов .doc, .exel, .pdf. Заранее спасибо. | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 14:30)
| | Подделать mime тип - плевое дело. Скрипты могут содержать даже в картинках - т.е. пользователь увидет, например, бабочку, но..
Поэтому лучше при загрузке изображений создавать ее копию (так, во-первых, у вас будет только изображение, во-вторых, можно привести все к одному формату). Накопал где-то в старых файлах (писалось не меньше года назад), так что просто для ознакомления с идеей:
<?php
/* upload_pic(string src, string dest [, int quality[, string filename]])
string src - путь до изображения,
string dest - путь для сохраняния (БЕЗ имени файла)
quality - качество сжатия
filename - имя файла
*/
function upload_pic($src, $dest, $quality = 75, $filename = null) {
global $error;
$size = getimagesize($src);
if ($size === false) {
// в квадратных скобках указываем порядковый номер ошибки,
чтобы понять, на каком этапе она вылезла
$error[] = 'Изображение имеет неизвестный формат[1]';
return false;
}
if ( empty( $filename ) ) {
$filename = substr( md5( time() ), 0, 12) . '.jpg'; // генерируем новое имя файла
}
$dest = rtrim($dest, "/"); // удаляем слеш с конца
$dest .= '/' . $filename; // лепим окончательный адрес
$quality = intval($quality);
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
if ($format == 'bmp') {
$error[] = 'Изображение имеет недопустимый формат (.bmp)
(Обработка файлов .bmp не поддерживается стандартными средствами PHP';
return false;
}
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) {
$error[] = 'Изображение имеет неизвестный формат[2] ' . $icfunc;
return false;
}
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($size[0], $size[1]);
imagefill($idest, 0, 0, 0xFFFFFF);
imagecopyresampled($idest, $isrc, 0, 0, 0, 0, $size[0], $size[1], $size[0], $size[1]);
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return $filename;
}
|
| |
|
|
|
|
|
|
|
для: neadekvat
(29.11.2010 в 14:54)
| | делать копию после того как картинка поместилась во временную папку $_FILES['foto']['name'] и от туда уже делаем копирование?
src - т.е. указываю путь к временной папке $_FILES['foto']['name']?
П.С. а как быть тогда с док, ексель и пдф? как их проверять, тут копирование не прокатит) | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 16:03)
| | Нет, берете картинку из временной папки (доступна через _FILES), делайте из нее копию в памяти (imagecreatefrom*()) и затем сохраняете уже в постоянную папку.
С .doc, .xls, .pdf - не могу с ходу сказать, надо гуглить. | |
|
|
|
|
|
|
|
для: neadekvat
(29.11.2010 в 16:13)
| | >Нет, берете картинку из временной папки (доступна через _FILES), делайте из нее копию в памяти (imagecreatefrom*()) и затем сохраняете уже в постоянную папку.
почему нет?:) после загрузки файла он помещается во временную, а от туда уже делаем копию в память, я так и писал :) | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 16:20)
| | Вы два раза написали слова "копия", отчего я и подумал, что вы собрались лишний раз что-то куда-то копировать | |
|
|
|
|
|
|
|
для: neadekvat
(29.11.2010 в 16:23)
| | ясно, намудрил с выражением)) | |
|
|
|
|
|
|
|
для: neadekvat
(29.11.2010 в 14:54)
| | вернемся назад...
там говорилось чтобы обезопасится от вируса можно скопировав исходное загруженное изображение в память и создать на основе его новое, но мы же перед копированием должны прочитать исходное загруженное изображение, т.е. открыть и тут мы уже вирус подхватим
я думаю достаточно будет направить антивирус мониторить папку куда будут грузится эти картинки и проверять и кстати какой путь на сервере временной папки куда грузятся файлы? | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 17:08)
| | Интерпритатор подхватит? оО Насколько я знаю, изображение не будет открываться также, как открываете его вы на компьютере - оно будет побайтово считываться в память. | |
|
|
|
|
|
|
|
для: neadekvat
(29.11.2010 в 17:11)
| | а разве не считается вместе вирус? | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 17:21)
| | Только то, что является самим изображениям, все мета-данные и т.д. полетят мимо. | |
|
|
|
|
|
|
|
для: neadekvat
(29.11.2010 в 17:23)
| | довольно интересно, есть кто такого же мнения? | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 17:35)
| | Вы бы лучше почитали о структуре файлов изображений, чтобы не собирать мнения. А нарисовать картинку такую, чтобы это было изображение, и одновременно его данные были бы "червяком", это знаете-ли практически не возможно. | |
|
|
|
|
|
|
|
для: TetRiska
(29.11.2010 в 17:35)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Slo_Nik
(29.11.2010 в 20:13)
| | спасибо | |
|
|
|
|
|
|
|
для: TetRiska
(30.11.2010 в 04:04)
| | кстати, а если загружать на сервер файлы и изменять им атрибут на -Х
1 - будут ли картинки открываться на сайте?
2 - исполнение скриптов загружаемых с этим атрибутов будет невозможным?
П.С. говорят что еще можно с помощью хтаксесса запретить выполнение скриптов, только не пойму что туда прописать нужно? и еще говорят, чтобы уберечь хтаксесс от перезаписи нужно выставить права лишь на чтение? | |
|
|
|