Думаю не для кого не секрет, что сделать безопасную загрузку изображений на сервер достаточно проблематично, так как практически любую защиту/проверку можно обойти при должных стараниях. Стопроцентный безопасный вариант - это обработка изображения средствами getimagesize(), которая вернет FALSE в случае загрузки шеллов/вредоносных файлов. Чтобы это действие упростить я использую class.upload, который позволяет в добавок ко всему еще и обработать изображение как только захочется.
В данном коде я приведу лишь некоторые примеры использования этого класса с картинками для выполнения различных действий. Полное описание читайте на оф. сайте.
Сссылка на сам класс:
http://www.verot.net/php_class_upload_download_zip.htm
$foo = new Upload($_FILES['form_field']); // создаем экземпляр класса
if ($foo->uploaded) {
// сохраняем изображение без изменений:
$foo->Process('/path/to/save/');
//
// сохраняем изображение с новым именем
$foo->file_new_name_body = 'new_name';
$foo->Process('/path/to/save/');
//
// сохраняем изображение с новым именем в формате gif
// при этом делаем ресайз по ширине до 100 px
// (ширина будет изменена пропорционально высоте)
$foo->file_new_name_body = 'new_name_custom';
$foo->image_resize = true;
$foo->image_convert = gif; // jpeg, png
$foo->image_x = 100;
$foo->image_ratio_y = true; // false для непропорционального ресайза,
// image_ratio_x для ресайза по ширине
$foo->Process('/path/to/save');
//
// добавляем рамку изображению
$foo->image_border = 5;
$foo->image_border_color = '#00FF00';
$foo->image_border_opacity = 50;
$foo->Process('/path/to/save/');
//
// добавляем watermar
$foo->image_unsharp = true;
$foo->image_border = '0 0 16 0';
$foo->image_border_color = '#000000';
$foo->image_text = "profiwm.ru";
$foo->image_text_font = 2;
$foo->image_text_position = 'B';
$foo->image_text_padding_y = 2;
$foo->Process('/path/to/save/');
}