Я пытаюсь сделать простой код для загрузки изображения прямо с URL-адреса. Однако у меня есть опасения по поводу безопасности моего кода, поскольку пользователь может отправить любой URL-адрес. Как я могу сделать его более безопасным?
Все найденные мной хорошие примеры всегда относятся к файлам, загруженным через форму.
Поэтому у меня возникают трудности с улучшением этого кода.
$img_url = "https://i.ytimg.com/vi/wSdT-SArM2Q/maxresdefault.jpg";
function getimg($url)
{
$headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';
$headers[] = 'Connection: Keep-Alive';
$headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
$user_agent="php";
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, $user_agent); //check here
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
$return = curl_exec($process);
curl_close($process);
return $return;
}
$imagename = basename($img_url);
if (file_exists('./upload/' . $imagename)) {
//
}
$image = getimg($img_url);
file_put_contents('upload/' . $imagename, $image);
1 ответ
Я пытаюсь сделать простой код для загрузки изображения прямо с URL-адреса.
Вы имеете в виду скачать.
Как я могу сделать его более безопасным?
Есть ли причина, по которой вы хотите сохранить исходное имя файла после применения функции basename? Это должно защитить от базовых попыток обхода пути, таких как ../../, но вы также можете полностью переименовать файл. Если вы храните запись в базе данных, использование идентификатора было бы хорошим выбором + добавление расширения файла (но не разрешать Любые расширение файла — см. ниже).
Это было бы лучше, чем рисковать и выяснять возможные подводные камни с вашей функцией. Вы не контролируете имя файла, и опасность заключается в доверии к вводу пользователя. Не говоря уже о том, что могут быть некоторые творческие попытки с использованием символов Unicode или чего-то еще. Легче сказать, чем сделать, но я не могу гарантировать, что ваш код на данный момент безопасен на 100%.
Самая большая проблема здесь в том, что кто-то может предоставить URL-адрес веб-оболочки с расширением .php, который ваш скрипт с радостью загрузит в папку загрузки. Если эта папка находится в корне вашего веб-сайта, злоумышленник может позвонить http://example.com/upload/shell.php к и взять на себя ваш сервер. Это то, что вы легко можете проверить.
Поскольку это то, что делает ваш скрипт, он будет загружать что угодно по запросу. Как минимум, эта папка загрузки должна не находиться в корне сайта. Таким образом, проблема заключается не только в имени файла, но и в его расширении, а также в том, где находится эта папка для загрузки.
Также нет гарантии, что имя файла будет уникальным. Кажется, вы каким-то образом справляетесь со сценарием, о котором мы не знаем.