[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Безопасная загрузка изображений
OTSHELNIK
Очень интересует вопрос о том,как именно организовать безопасную загрузку изображений и вывод изображения в профиле юзера. Расскажите подробнее об этом,желательно с примерами кодов. Я впринципе уже читал про то,как можно организовать,но не было кодов для примеров,а знаний реализовать не хватает.

Ну,или подскажите скрипт с понятным кодом,желательно без использования шаблонов,а то их понять не могу.



Спустя 13 минут, 37 секунд (4.05.2010 - 11:06) phz написал(а):
Почитайте http://irbis-team.com/15/13/2

Спустя 11 часов, 29 минут, 24 секунды (4.05.2010 - 22:35) ak167 написал(а):
OTSHELNIK, в моем движке это устроено так:


$db_table_user="user"; // имя таблицы записи пользователей в БД
$db_table_hack='hack'; // если кто-то попытается взломать, запишем его в эту таблицу
$db_user_conf='conf'; // таблица настроек (макс. ширина картинки и т.п.)


$db_server='mysqlserver'; // сервер БД
$db_user='apple'; // имя пользователя БД
$db_pass='12345'; // пароль БД
$db_name='baza_1'; // имя базы

// функция отчистки полей от html и ненужных символов

function clean_field($pole)
{
$pole=htmlspecialchars($pole);
$t1=chr(10);
$t2=chr(13);
$pole=nl2br(trim(strip_tags($pole)));
$pole=str_replace($t1, ' ', $pole);
$pole=str_replace($t2, ' ', $pole);
return $pole;
}

// получим настройки из БД
$sql="SELECT avatar_size, avatar_width, avatar_height FROM $db_user_conf LIMIT 1";
$result_avatar=mysql_query($sql, $connect);
if($result_avatar){$db_avatar_pref[]=mysql_fetch_array($result_avatar);} else {$error='Не удалсоь соединитья с БД для получения параметров аватара!';}

// если аватар был отправлен юзером, загрузим его
if($_POST['go']==6)
{

if(is_uploaded_file($_FILES['avatar']['tmp_name']))
{

// узнаем параметры загружаемого аватара ,чтобы сравнить их с допустимыми параметрами из БД
$options_avatar=getimagesize($_FILES['avatar']['tmp_name']);

// проверим соответсвует ли загружаемый аватар нашим параметрам
if($options_avatar[2]>4){$error='<br>Аватар имеет неразрешенный тип!';}

// проверим соответствует ли размер аватара допустимому
if($_FILES['avatar']['size']>$db_avatar_pref[0]['avatar_size']){$error.='<br>Аватар слишком велик!';}

// проверяем ширину и длинну
if($options_avatar[0]>$db_avatar_pref[0]['avatar_width']){$error.='Ширина превышает допустимую норму!';}
if($options_avatar[1]>$db_avatar_pref[0]['avatar_height']){$error.='Длинна превышает допустимую норму!';}

// сохраним аватар на сервере, если нет ошибок
if(!$error)
{

// путь+имя аватара, но пока без расширения
$avatar_way='user/avatar/'.$_SESSION['id'];

// добавляем расширение
switch($options_avatar[2])
{
case '1': $avatar_way.=".gif"; break;
case '2': $avatar_way.=".jpg"; break;
case '3': $avatar_way.=".png"; break;
}

// удалим уже существующие аватары
@unlink($_SESSION['avatar']);

$result_copy=copy($_FILES['avatar']['tmp_name'], $avatar_way); // сохраним файл на сервер
if(!$result_copy){$error.='Ошибка сервера! Запись данных невозможна!';}

if(!$error)
{
// запишем данные в БД
$sql="UPDATE $db_table_user SET avatar='".$avatar_way."' WHERE id='".$_SESSION['id']."' LIMIT 1";
$update_db=mysql_query($sql, $connect);
if($update_db)
{
$ok='Данные обновлены!';
$_SESSION['avatar']=$avatar_way;
} else {$error='Ошибка БД!';}
}
}


// если юзер под видом загрузки аватар пытался атаковать сайт, запишем его данные в базу
} else {$page=$_SERVER['PHP_SELF']; $sql_hack="INSERT INTO $db_table_hack (id_hacker, type, page, time) values ('".$_SESSION['id']."', 'Пресечена попытка взлома через загрузку аватара', 'profile.php', '".date("Y-m-d H:i:s")."')"; mysql_query($sql_hack, $connect);}
}




// удалим аватар
if($_GET['del_avatar'])
{
// какой аватар нужно удалить
$del_ava=clean_field($_GET['del_avatar']);

// проверим действительно ли это аватар именно этого юзера
if($_SESSION['avatar']==$del_ava)
{
// если это его аватар, тогда удаляем
$sql="UPDATE $db_table_user SET avatar='' WHERE id='".$_SESSION['id']."' LIMIT 1";
$update_db=mysql_query($sql, $connect);
if($update_db)
{
@unlink($_SESSION['avatar']);
unset($_SESSION['avatar']);
$ok='Данные обновлены!';
} else {$error='Ошибка БД!';}
}
else{$error='Ошибка безопасности!';}

}


echo "<h2>Аватар</h2>";
if($ok){echo $ok;}
if($error){echo $error;}

// отобразим аватар, если он есть
if($_SESSION['avatar'])
{
echo '<img src="'.$_SESSION['avatar'].'"></img><br><a href="'.$_SERVER['PHP_SELF'].'?profile=6&del_avatar='.$_SESSION['avatar'].'">Удалить</a>';
}



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


<?php

// выведем сообщение о том, какой аватар можно загружать
echo '<br><br><center><b>Допустимые параметры:</b></center>';
echo '<br>Масимальная ширина: '.$db_avatar_pref[0]['avatar_width'];
echo '<br>Масимальная длинна: '.$db_avatar_pref[0]['avatar_height'];
echo '<br>Масимальный размер: '.$db_avatar_pref[0]['avatar_size'];
echo '<br>Допустимые форматы: jpeg, gif, png';



Конечно, чтобы это работало надо присвоить юзеру сессию 'id' с его id и 'login' с его логином. В БД в таблице user не забудь сделать соответствующие поля, включающие в себя поле "avatar". Например id, login, pass, avatar.
Таблица настроек (conf) должна содержать поля avatar_size, avatar_width, avatar_height, в которых указаны максимальные параметры (размер, длинна и ширина) а в таблицу hack записываем всех, кто пытался взломать сайт с помощью загрузки аватара (поля: id_hacker, type, page, time).
И не забудь создать папку user/avatar

Спустя 8 часов, 50 минут, 39 секунд (5.05.2010 - 07:26) OTSHELNIK написал(а):
phz, спасибо,почтиаю.
ak167, вроде как код плнятен для меня,попробую поразбирать его,разобраться попробую smile.gif


Спустя 4 часа, 17 минут, 9 секунд (5.05.2010 - 11:43) Кир написал(а):
Не знаю, надо ли тебе это, OTSHELNIK, но можно сделать по другому для аватаров, чтобы не хранить путь к аватару в бд, проверяешь его по пути на сервере, к примеру если логин пользователя "vasyunya" то делаешь проверку на наличие файла avatar.jpg(как образец) в папке пользователя /users/vasyunya/ Если такой файл там есть то отображаешь его, если нету то присваиваешь путь к аватару по умолчанию, типа images/default.jpg

Спустя 28 минут, 43 секунды (5.05.2010 - 12:12) twin написал(а):
Неправильный подход.
Зачем каждый раз бегать к файловой системе для проверки, если в базу уже все равно сходили?

Спустя 28 минут, 22 секунды (5.05.2010 - 12:40) Кир написал(а):
тоже верно, но мне советовали не пихать в базу путь к аватарке или фотке пользователя, вообще интересно что лучше, на каждой странице базу тревожить или файловую систему:)

Спустя 12 минут, 56 секунд (5.05.2010 - 12:53) twin написал(а):
Если база всеравно тревожится, зачем еще фс трогать? Аватарка нужна при постинге, ну можно в сессию путь положить, если она рядом с приветствием. Но сканировать каждый раз директорию на предмет наличия - расточительно.
Быстрый ответ:

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