[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: обработчик загрузки картинок
zeromind
картинки заливаю с помощью флэша - SWFUpload, php обработчик к нему написал на скорую руку, интересует правильность проверок и вообще безопасность скрипта, работаю с изображения практически впервые), сам обработчик:

<?php

/**
* Constans
* Константы
*/

define('IRB_ROOT', str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']) .'/core/');
define('IRB_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/core/');

/**
* Variables
* Переменные
*/

$allowedext = array('jpg', 'jpeg', 'png', 'gif'); //допустимые расширения
$maxfilesize = 2 * 1024 * 1024; //2 MB max размер файла
$findtchka = substr_count($_FILES['Filedata']['name'], ".");
//Проверяем пришла ли из JS - var Direction (создание уникальной папки для каждого юзера, в кач-ве название - логин)
isset($_POST['Direction']) AND !empty($_POST['Direction']) ? $login = trim(strip_tags($_POST['Direction'])) : $login = "OTHERS";
//Пути к директории
$updir = IRB_ROOT.'uploads/full/'.$login.'/';
$updirpreview = IRB_ROOT.'uploads/preview/'.$login.'/';
$updirhost = IRB_HOST.'uploads/full/'.$login.'/';
$updirhostpreview = IRB_HOST.'uploads/preview/'.$login.'/';

//если существует массив $_FILES и не было ошибок
if(isset($_FILES) AND $_FILES['file']['error'] == 0){
$nameimg = $_FILES['Filedata']['name']; //название картинки в массиве $_FILES

//проверки

$ext = end(explode('.', strtolower($_FILES['Filedata']['name'])));
if (!in_array($ext, $allowedext)){
echo "Ошибка: не правильный формат файла.";
exit;
}
if ($maxfilesize < $_FILES['Filedata']['size']){
echo "Ошибка: размер файла превышает лимит: ".$maxfilesize." байт.";
exit;
}
if ($findtchka>1){
echo 'Ошибка: точка встречается в имени файла '. $findtchka. ' раз(а).';
exit;
}

//Если файл загружен в $_FILES
if (is_uploaded_file($_FILES['Filedata']['tmp_name'])){

if(!is_dir($updir)){
$createfolder = @mkdir($updir,0755);
if(!$createfolder) {die("Ошибка: Не удалось создать папку.");}
}


$filename = $updir.$nameimg; //название файла + полный путь
$filenamehost = $updirhost.$nameimg; //для отображения в HTML

//если файл с таким именем уже существует...

if(file_exists($filename)) {
echo "Ошибка: файл с таким названием уже существует.";
exit;
}

if(move_uploaded_file($_FILES['Filedata']['tmp_name'], $filename)){
echo '<a href="'.$filenamehost.'">'.$nameimg.'</a><br>'; //делаем ссылку
/**
* Resize image
* Ресайз картинки
*/

if(!is_dir($updirpreview)){
$createfolder = @mkdir($updirpreview, 0755);
if(!$createfolder) {die("Ошибка: Не удалось создать папку.");}
}

$filenamepriview = $updirpreview.$nameimg; //полный путь до картинки priview
$filenamehostpriview = $updirhostpreview.$nameimg;

include IRB_ROOT."libs/resize-class.php";
$resizeObj = new resize($filename);
//режимы: 1 - exact(по заданным height&width) 2 - portrait(fixed height) 3 - landscape(fixed width) 4 -auto(fixed heigth or width) 5 - crop
$resizeObj -> resizeImage(200, 200, 'crop');
$resizeObj -> saveImage($filenamepriview, 90);

echo '<a href="'.$filenamehostpriview.'">'.$nameimg.'</a><br>'; //делаем ссылку preview

}else{
echo 'Ошибка: файл не перемещен в директорию.';
}
}
}


корректна ли проверка на расширение файла? или с MIME type правильнее будет?

и ешё немного не по теме:
- обратно в JS приходят только ссылки с загруженными картинками, если была ошибка - они не выводится..(использую var serverData - это в SWFupload'e). я думаю нужно все переменные с ошибками собрать, сериализовать в JSON и отправить обратно ? и тогда уже ответ распарсить, и вывести как надо..



Спустя 10 минут, 37 секунд (24.11.2011 - 18:54) Игорь_Vasinsky написал(а):
getimagesize() - вот это сила.

Спустя 1 час, 12 минут, 23 секунды (24.11.2011 - 20:06) redreem написал(а):
я еще "белый лист" разрешенных расширений использую в довесок.

Спустя 1 минута, 22 секунды (24.11.2011 - 20:07) zeromind написал(а):
Цитата (redreem @ 24.11.2011 - 20:06)
я еще "белый лист" разрешенных расширений использую в довесок.

что ты имеешь под "белым листом" ?

Спустя 8 минут, 58 секунд (24.11.2011 - 20:16) redreem написал(а):
zeromind


var $whiteList=array('gif','jpg','jpeg','png');

foreach ($this->whiteList as $ext) {
$fExt='.'.$ext;
if (preg_match("/$fExt\$/i", $_FILES[$inputfilename]['name'])) $this->fileExt=$fExt;
if($this->info['mime']=='image/'.$ext) $mime=true;
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.