В прошлой статье мы с Вами разбирали загрузку файлов на сервер в PHP . Однако, я Вам уже сказал, что использовать код, который там был рассмотрен, категорически нельзя! И в этом материале мы поговорим о безопасности при загрузке файлов на сервер в PHP .
В прошлой статье мы с Вами разбирали загрузку файлов на сервер в PHP. Однако, я Вам уже сказал, что использовать код, который там был рассмотрен, категорически нельзя! И в этом материале мы поговорим о безопасности при загрузке файлов на сервер в PHP.
Давайте напомню код, который мы вчера рассматривали:
<?php
$uploadfile = "images/".$_FILES['somename']['name'];
move_uploaded_file($_FILES['somename']['tmp_name'], $uploadfile);
?>
Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы очень тщательно. И сейчас мы с Вами займёмся их тщательной проверкой.
Поскольку различных вариантов задач может быть очень много, рассмотрим вариант с загрузкой простого изображения, на которые должны накладываться следующие ограничения:
- Тип - только jpg (jpeg).
- Размер - менее 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 и размер. Проверяем их на удовлетворение нашим условиям. Если всё хорошо, то мы загружаем файл.
Вы, наверное, можете спросить: "А зачем надо проверять и расширение, и MIME-type?". Тут очень важно понимать, что это далеко не одно и то же. Если злоумышленник попытается отправить PHP-файл через браузер, то и одной проверки MIME-type хватит, чтобы его попытка провалилась. А вот если он напишет какой-нибудь скрипт, который будет формировать запрос и отсылать вредосный файл, то этого не хватит. Почему? А потому, что MIME-type задаётся клиентом, а не сервером! И фактически, злоумышленник может поставить любой MIME-type (и картинки тоже), но при этом отсылать PHP-скрипт. И вот именно такую хитрую попытку мы и ломаем, проверяя на расширение файла.
Я сразу скажу, что данный код далеко не 100% защита (100% просто не существует), однако, взломать такой код будет очень и очень тяжело, поэтому можете смело утверждать, что Вы обеспечили высокую безопасность при загрузке файлов на сервер через PHP.
