[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт загрузки аватара на сайт
ak167
Привет всем!

Вот мой скрипт загрузки аватара на сайт. Ава загружается в папку "avatars" на сервер и в качестве имени для авы присваивается id пользователя. извлекаемый из $_SESSION['id'].
Скажите пожалуйста насчет уязвимостей такого скрипта. Он очень уязвим? Можно ли под видом рисунка загрузить что-нибудь другое? Если да, то нет ли у вас безопасного скрипта? или просто подскажите, как обезопасить этот.



echo "Загрузка аватара:<br>";

// если аватар был отправлен юзером, загрузим его
if($_POST['go']==5)
{
// проверим соответсвует ли загружаемый аватар нашим параметрам
if($_FILES['avatar']['size']>50000){$err_avatar_size='Аватар слишком велик!';}
if(!($_FILES['avatar']['type']=='image/pjpeg' OR $_FILES['avatar']['type']=='image/jpeg' OR $_FILES['avatar']['type']=='image/gif'))
{$err_avatar_type='Файл имеет неразрешенный тип!';}

// сохраним аватар на сервере, если нет ошибок
if(!$err_avatar_size AND !$err_avatar_type)
{
$avatar_name=$_SESSION['id'];

$avatar_way="avatars/".$avatar_name; // путь в аватару

// удалим уже существующие аватары

$avatar_del=$avatar_way.".gif";
@unlink($avatar_del);
$avatar_del=$avatar_way.".jpg";
@unlink($avatar_del);

// добавляем расширение к файлу
switch($_FILES['avatar']['type'])
{
case 'image/pjpeg': $avatar_way.=".jpg"; break;
case 'image/jpeg': $avatar_way.=".jpg"; break;
case 'image/gif': $avatar_way.=".gif"; break;
}

copy($_FILES['avatar']['tmp_name'], $avatar_way); // сохраним файл на сервер
}
}


// выведем ошибки, если они есть
if($err_avatar_size){echo $err_avatar_size;}
if($err_avatar_type){echo $err_avatar_type;}

$catalog="avatars";

// удалим аватар
if($_GET['del_avatar'])
{
$del_ava=$catalog."/".$_GET['del_avatar'];
@unlink($del_ava);
}


// отобразим уже загруженный аватар
$i=1;
$dir = opendir ($catalog);
while ($file = readdir ($dir))
{
if(is_file($catalog."/".$file))
{
echo '<br><img src="'.$catalog.'/'.$file.'"></img><br>';
echo '<a href="'.$_SERVER['PHP_SELF'].'?profile=5&del_avatar='.$file.'">Удалить</a><br>';
}
}

closedir ($dir);


// форма загрузки
?>
<form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<
input type="hidden" name="go" value="5">
<
input type="file" name="avatar"><br><br>
<
input type="submit" value="закачать"><input type="Reset" value="сброс">
</
form>





Спустя 1 год, 3 месяца, 12 дней, 15 часов, 40 минут, 20 секунд (2.08.2011 - 15:02) Dames написал(а):
if($_POST['go']==5) {

Замените на
if(isset($_POST["submit"])) {

Удалите
<input type="hidden" name="go" value="5">

Спустя 1 час, 49 минут, 47 секунд (2.08.2011 - 16:52) killer8080 написал(а):
if(!($_FILES['avatar']['type']=='image/pjpeg' OR $_FILES['avatar']['type']=='image/jpeg' OR $_FILES['avatar']['type']=='image/gif'))
бесполезная проверка, $_FILES['avatar']['type'] - это пользовательские данные, которые пришли в соответствующем заголовке, им верить нельзя! Правильно примерно так
$img = getimagesize($_FILES['avatar']['tmp_name']);
if(substr($img['mime'], 0, 5) !== 'image'){
die('file is not an image');
}
вместо copy() нужно применять move_uploaded_file(). В этом случае нет необходимости проверять файл на существование, он автоматически будет переписан.
	 // добавляем расширение к файлу
switch($_FILES['avatar']['type'])
{
case 'image/pjpeg': $avatar_way.=".jpg"; break;
case 'image/jpeg': $avatar_way.=".jpg"; break;
case 'image/gif': $avatar_way.=".gif"; break;
}

copy($_FILES['avatar']['tmp_name'], $avatar_way); // сохраним файл на сервер
}
}
вместо этих танцев с бубном, проще сразу взять расширение исходного файла, не забывая делать проверку по списку разрешённых расширений
$allow_types = array('jpg', 'jpeg', 'gif', 'png');
$ext = strtolower(pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION));
if(!in_array($ext, $allow_types))
die('file extension is incorrect');


PS код писал не проверяя может где и ошибся :)

Быстрый ответ:

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