В cms используется автоматическое создание превью изображений.
Для этого в mod_rewrite настроено правило, по которому запрос к несуществующей картинке, например image.100x100.jpg, перенаправляется на скрипт, создающий превью изображения image.jpg размером 100x100.
Для того, чтобы злоумышленник не мог самостоятельно вызвать создание любого превью, в этот скрипт передается так же некий токен, который является md5(имя файла + соль).
Суть проблемы в выборе соли, а именно:
Не хочется просить пользователя придумывать соль при установке cms.
Не хочется автоматически генерировать соль при установке, так как не все пользуются установщиком, таким образом соль у многих будет одинаковая, чего допускать нельзя.
Вообще, не очень хочется где-либо хранить её.
Хочется просто «на лету» брать в качестве соли некие данные, которые уникальны для каждой копии скрипта и неизвестны злоумышленнику.
Например, время последней модификации какого-то файла подошло бы, если бы не подбиралось так легко.
Так же подошло бы просто имя домена, на котором работает скрипт, но оно известно злоумышленнику.
Ну и, очевидно, соль не должна меняться со временем, по крайней мере какое-то достаточно длительное время
UPD: похоже darkslesh указал верный путь — хранить в настройках соль(как просто случайное число)+домен, для которого она создана, и при несовпадении домена в настройках с реальным доменом, перегенерировать соль.
А не проще ли сделать такую систему:
1) создаётся файл (не в WEB папке или в закрытой папке )
2) в этот файл записывается 2 строки типа xxxxxxxxx и randomstr, где xxxxx — ip адрес сервера или домен, а вторая строка — как раз соль которая тебе нужна
3) скрипт который использует эту соль считывает файл, затем если IP/домен не совпадает, то сгенерить файл, с новыми параметрами.
Таким образом не нужно будет заботится о том, что скрипт работает без установки.
Еще есть вариант как нибудь извратится с использованием _SERVER[«UNIQUE_ID»] который генерится при каждом запросе пользователя.
Сам думал над тем, чтобы в настройках по умолчанию оставить $salt=null, и генерировать ее при первом запросе, но боялся что случайно забуду в релизе оставить ее пустой.
Похоже что ваш вариант с доменом — то что нужно!
Фактически, получается, что требуется подтвердить подлинность запроса превьюшки. Причем обычно, как я понимаю, этот запрос будет генерить сама cms. Ну так возьми и зашифруй MD5(имя файла) любым алгоритмом шифрования. По смыслу — выйдет подпись запроса, которую может сделать только тот, у кого есть ключ (cms).
P.S. А можно пояснить — в чем состоит риск того, что злоумышленник запросит превью любой картинки?
Тогда будет требоваться ключ, который опять же придется генерировать при установке или просить пользователя вручную сделать, а в вопросе сказано что нежелательно это делать
Все верно, только если делать просто md5(filename) — злоумышленник тоже может сделать этот md5 и запросить картинку в любом разрешении.
Риск — в том, что злоумышленник может нагенерировать 100500 (и даже больше) ненужных картинок. Так можно вообще положить сайт — создание превью очень ресурсоемкое занятие. Ну и место на диске просто закончиться
Ну, в конце концов, если не хочется напрягать пользователя — вшей ключ для подписи в код CMS. Или генерируй один раз случайным образом при первом обращении к превью, после чего сохраняй в файлик и используй повторно.
Вот только повторюсь, мне кажется, это должна быть не соль, а именно ключ подписи.
и при несовпадении домена в настройках с реальным доменом, перегенерировать соль.
и доставив массу веселья тому человеку, который попытается это все перенести на новый домен, или исполльзовать одну сиситему на нескольких доменах сразу.
Или задействовать время запроса. т.е. как только человек запросил страницу, то брать это время с точность до микросекунд и потом его использовать. Подбирать будет бесполезно такое.
В скрипте создания превью я не могу знать время создания токена.
Скрипт, который делает превью и который просто создает ссылку на превью — независимые скрипты
А отдавать через nginx уже готовые превьюшки в моем методе тоже не проблема. Они генерируются только при первом запросе, а далее остаются лежать на диске
Я немного не понял, в какой момент будет генерироваться md5-токен?
В html-коде страницы будет [img src="image.100x100.jpg"/]
или [img src="image.100x100.jpg{md5(...)}"/]
?
Если первое (md5 генерируется на пути от http-запроса до скрипта превью), то никакой защиты по сути нет.
Если второе (md5 генерируется в момент волеизъявления использования изображения в какой-либо части сайта — создание шаблона, документа и т.п.), то что мешает вместо генерирования md5 создать в этот момент необходимое превью?