
Первым делом, что нужно усвоить — это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:
<form action="loading.php" method="post" enctype='multipart/form-data'> <input type="file" name="somename" /> <input type="submit" value="Загрузить" /> </form> |
Ключевой момент здесь — это атрибут «enctype» со значением «multipart/form-data». Без него ничего работать не будет.
Теперь пишем скрипт «loading.php», в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:
<?php print_r($_FILES); ?> |
В результате, Вы увидите содержимое глобального двумерного массива $_FILES:
- name — имя загружаемого файла.
- type — MIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type.
- tmp_name — физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
- error — код ошибки. Если 0, то ошибок нет.
- size — размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).
И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).
Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код в файл («loading.php»):
<?php $uploadfile = "images/".$_FILES['somename']['name']; move_uploaded_file($_FILES['somename']['tmp_name'],$uploadfile); ?> |
То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию «images» с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.
Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И сейчас мы с Вами займёмся их тщательной проверкой.
Поскольку различных вариантов задач может быть очень много, мы рассмотрим вариант с загрузкой простого изображения, на которые должны накладываться следующие ограничения:
2. Размер — менее 100 КБ.
Теперь реализуем скрипт «loading.php» в соответствии с этими требованиями:
<?php $blacklist=array(".php",".phtml",".php3",".php4",".html",".htm"); foreach ($blacklist as $item) if(preg_match("/$item\$/i", $_FILES['somename']['name'])) exit; $type = $_FILES['somename']['type']; $size = $_FILES['somename']['size']; if (($type != "image/jpg") && ($type != "image/jpeg")) exit; if ($size > 102400) exit; $uploadfile = "images/".$_FILES['somename']['name']; move_uploaded_file($_FILES['somename']['tmp_name'],$uploadfile); ?> |
Теперь давайте посмотрим, что здесь происходит. Первым делом мы проверяем на расширение загруженный файл. Если он представляет собой PHP-скрипт, то мы такой файл просто не пропускаем. Дальше мы получаем MIME-type и размер. Проверяем их на удовлетворение нашим условиям. Если всё хорошо, то мы загружаем файл.