@YanAlexandrov
Чайник со стажем

Защита от бесконтрольного создания картинок?

Использую библиотеку для генерации изображений. К обычному урл дописываются get параметры. На их основе создаются уменьшенные копии оригинального изображения. При обращении по пути:
https://путь/к/картинке.jpg?w=100&h=100 создаётся папка с именем 100*100 и туда генерируется картинка с соответствующим размером. При повторном обращении картинка уже отдаётся из папки.

Как можно организовать защиту, чтобы злоумышленник не мог создавать картинки, просто отправляя запросы? При этом желательно не ограничивать пользователя предустановленными размерами.
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 5
neuotq
@neuotq
Прокрастинация
Гуглите "Rate Limiting" для вашего фреймворка, библиотеки, возможно на уровне веб сервера или чего ещё. И постройте логику приложения так, что если нужно отдавать не статитку, то условно свободно, а если генерировать, то тут ограничения. Обычно это делается на одно условное устройство/пользователя и/или отдельно на отдельный роут/операцию/функцию.
Ну например, на пользователя 5 раз в секунду, на роут генерации картинки 100 раз в секунду, если больше любого лимита, возвращай код 429.
Ответ написан
gbg
@gbg
Любые ответы на любые вопросы
Идентифицировать пользователя и вводить ограничение на количество конвертаций.

Для разных категорий - разная степень жесткости ограничений - например, если залогинен по верифицированному акку на госуслугах - мало ограничений (10k запросов в сутки), если это куча запросов с ip, находящегося в списке выходных нод TOR - 1 запрос в сутки, дальше - капча.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Вопрос из серии "дурная голова ногам покою не даёт".

Очередная дурь, которая исходит из нелепых фантазий (с какой стати пользователю задавать размер картинки), и воображаемых угроз (сайта нету, картинок нету, злодеев не видно, но сало надо перепрятать!) реализация которой затруднит жизнь нормальным пользователям и вообще никак не остановит шкодливого пятиклассника.

Ответы тоже, тостер-стайл: "я вообще не доктор, я сантехник, но вот моё икспертное мнение..."

В общем, если это сервис по генерации картинок в разных размерах, то тупо лимит на юзера, плюс кэшировать только стандартные размеры.
Если это обычная галерея, то забыть про дебильную генерацию на лету и делать все размеры сразу при загрузке.
Ответ написан
vanchelo
@vanchelo
Например, в imgproxy для защиты, используется подпись URL с помощью HMAC https://docs.imgproxy.net/#/signing_the_url. Вы можете поступить похожим образом
Ответ написан
cr1gger
@cr1gger
Все дороги ведут в Рим — встретимся в Риме!
А зачем их сохранять ?!
Преобразуй в base64 и отдавай в этом формате пользователю.
А браузер сам уже разберется что с ней делать и нормально отобразит.
Не нужно их сейвить.

У тебя есть только оригинал картинки и далее ты при изменении размера отдаешь пользователю картинку в формате base64, её так же можно будет и сохранить и подставить куда хочешь.

Можно даже без base64 тупо в blob только в заголовках это сказать браузеру:
header("Content-type: image/gif");
$img = file_get_contents('image.jpg');
echo $img;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы