Пишем нормальный загрузчик файлов на сервер. Такой предмет, как загрузчик файлов, думаю, нуждается во внимании, по нескольким причинам:
× актуальность
× удобность
× угроза атаки
Представьте себе форум, без возможности выбора аватара, или представьте сколько времени можно сэкономить, загружая файлы прямо из окна браузера, не используя различные ftp-клиенты.
И так приступим.
Рассмотрим проблему безопасности. В настоящее время каждый школьник(эквивалентно слову "хакер") знает, что такое веб-шелл, знает что его можно залить на сервер(скажем, через глюки форума IPB, в панели загрузки смайликов) и тем самым заработать 25 рублей(эквивалентно 1$).
Чтобы обезопасить себя от такого рода злоумышленников, стоит запрертить загрузку файлов с раширением ".php".
PHP код:
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<title>r0:Умный загрузчик</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
</head>
<body>
<form action='<?=$_SERVER[PHP_SELF]?>' method='POST' enctype='multipart/form-data' >
<br />
Добавить херни: <input type='file' name='t_item'> <br />
<input type='submit' name='ok' value='Принять' />
</form>
</dt>
</dl>
</center>
<?php
if ($_POST[ok]) {
// Определяем директорию на сервере.
$upfiledir = $_SERVER[DOCUMENT_ROOT]."/dir1/dir2/";
// Полное имя загружаемого файла
$upfile = $upfiledir . basename($_FILES[t_item][name]);
### Определяем является ли файл - .php файлом ###
// Разрезаем имя файла на "название" и расширение
$ext = strtolower(strrchr($upfile, "."));
// Массив с враждебным ( o_O ) расширением
$extentions = array(".php");
// Если расширение загружаемого файла совпадает с "враждебным" -- хекер идет лесом
if (in_array($ext, $extentions))
{
echo "Лол, йо хэккер! =) <br /> Моя бабушка и то бы залила сюда веб-шелл =/ ";
exit;
}
// если файл перемещен в нужную директорию выводим информацию
if (move_uploaded_file($_FILES[t_item][tmp_name], $upfile ) )
{
// Данная переменная хранит относительную ссылку, которую можно поместить в БД
$uplink = "dir1/dir2/".$_FILES[t_item][name];
// Инфа о файле
echo "Файл ".$_FILES[t_item][name]." успешно загружен на сервер! <br />
Размер: ".$_FILES[t_item][size]." байт. <br />
Мим-тип: ".$_FILES[t_item][type];
}
}
И так.. в итоге получили данный скрипт, который перемещает файл с локального компьютера на сервер.
После того как получен HTTP-запрос, содержимое файла копируется во временный файл, созданный по умолчанию в каталоге сервера для временных файлов.
Информацию о файле можно получить, используя двумерный суперглобальный массив $_FILES.
$_FILES[file][name] - исходное имя.
$_FILES[file][size] - размер файла в байтах .
$_FILES[file][type] - MIME-тип файла.
$_FILES[file][tmp_file] - имя временного файла.
Помните !
1) Форма должна иметь атрибут enctype (enctype='multipart/form-data' ),
без которого загрузка не выполнится
2) Каталог для загрузки должен иметь права на запись, установить которые можно с помощью ftp-клиента или ф-и chmod.
PHP код:
Код:
bool chmod ( string filename, int mode )
Ну всё .. зуфсу