Главная->Уроки по php->Безопасность при загрузке файлов на сервер в PHP
Безопасность при загрузке файлов на сервер в 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.