Как безопасно загрузить изображение, когда пользователь нажимает на ссылку с PHP?

0

Хотите ссылку, которая загружает изображения (*.png, *.jpg, *.gif) на компьютер пользователя.

Протестирован следующий код из документации для загрузки файла http://php.net/manual/en/function.readfile.php

index.php

<html>
<head></head>
<body>
    <a href="download.php?file=nintendo.png">Download</a>
</body>
</html>

download.php

<?php

$file = $_GET['file'];

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
} else {
  echo "Ingen fil hittades";
}

?>

Заметили, что вы можете отредактировать ссылку, чтобы вы могли скачать все, если знаете имя файла, даже php файлы.

например:.../download.php? file = download.php Скачайте файл download.php

Можно ли изменить, чтобы можно было загружать изображения? Как сделать безопасную загрузку изображений, когда пользователь нажимает на ссылку?

  • 4
    тогда не используйте настоящие имена файлов. храните список доступных загрузок где-нибудь (например, в базе данных) и предлагайте файлы по их идентификатору. download.php?id=42 ничего не говорит пользователю о том, каким будет этот файл, и если вы запутаете значения идентификаторов (например, каким-то образом их зашифруете), тогда будет почти невозможно угадать другие значения.
  • 0
    Самый простой способ - составить список файлов, которые вы разрешаете загружать. Если они просят один не в этом списке, то не доставляйте его. Одним из способов может быть помещение файлов в определенную папку и проверка, чтобы они не пытались покинуть эту папку. ОБНОВЛЕНИЕ: мне нравится решение @MarcB's MarcB, попробуйте это.
Теги:

2 ответа

2

Вы можете просто использовать загрузку атрибутов, которая является новой для HTML5 и поддерживается Firefox и Chrome, как это, но не знает о браузерах IE

<a id="download" href="img/Chrysanthemum.jpg" download="a.jpg">Download</a>

EDIT: чтобы сделать изображение просто загружаемым, этой строки достаточно.

 Content-Disposition: attachment;
  • 0
    Да, зачем идти на все эти неприятности, просто поместите файл в ссылку с целевым пробелом и загрузите его,
  • 0
    Я смотрел на это, но не очень хорошая поддержка браузера caniuse.com/#feat=download
Показать ещё 1 комментарий
0

Если вы не ограничиваете то, что каждый пользователь может загрузить, я бы усложнил жизнь людям, чтобы они перестали угадывать имена файлов. Вы можете попробовать хэшировать имя файла, поэтому вместо file=nintendo.png будет file=1be98be84d040d99ca85f5a1786821bf7f4fd37a и ваш скрипт может затем проверить в базе данных, чтобы найти нужный файл, file=1be98be84d040d99ca85f5a1786821bf7f4fd37a поиск этого хеша.

Это может остановить людей, угадывающих имена файлов, но это не может помешать людям понять, что вы делаете, кто-то может попробовать разные хэши, такие как SHA-1 и MD5, с любыми именами файлов, которые они в настоящее время знают, и система позволит им загрузить файл. В этом случае неплохо использовать соль, что затруднит процесс шифрования.

Использовать соль очень просто, когда вы генерируете хэш из вашего имени файла, вы добавляете в микс другую переменную, это может быть специальный пароль, который вы знаете, дату, когда файл был добавлен в вашу систему. Все, что только вы узнаете.

Вот пример;

Текущая ссылка: file=nintendo.png

SHA1 Хэш: file=1be98be84d040d99ca85f5a1786821bf7f4fd37a

SHA1 Hash + "s3cr3tp4ssw0rd" Соль: file=184649ed65127047f80a46509d0b7447a837b692

Вы можете видеть, что соль снова изменила хэш. Надеюсь, это даст вам некоторую идею об обфускации и хешировании URL-адресов.

  • 0
    Можно ли ограничить, чтобы пользователи могли загружать только изображения? Мои имена картинок являются случайными числами, поэтому пользователю очень сложно угадать другую картинку. Что меня беспокоит, так это другие файлы на моем сервере
  • 0
    Да, вы должны были бы написать некоторые функции на вашем сайте, чтобы сделать это. Если у вас есть база данных с пользователями и именами файлов, вы можете создать действительно простую новую таблицу, одно поле может быть userid а другое - fileid . Когда кто-то пытается загрузить файл, ваш сайт проверяет новую таблицу, чтобы убедиться, что есть запись, которая совпадает как с userid и с userid fileid ; если да, то разрешите пользователю загрузить файл, если нет, то не позволяйте им. Если вы не хотите идти до такой степени, то, возможно, ваша страница загрузки может разрешать загрузку только файлов изображений. Может фильтровать по расширению.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню