Итак, на моем сайте (https://example.com) у меня есть страница, которая анализирует API last.fm и отбрасывает изображения со своего CDN akamai и отображает их на странице.
Дело в том, что все изображения подаются только по HTTP, https не поддерживается.
например: http://img.ruphp.com/php/76030502.png
У меня есть прокси-образ, написанный на php:
<?php header('Content-Type: image/png'); if(isset($_GET['img'])){echo file_get_contents($_GET['img']);} ?>
Это прекрасно работает, однако, не является безопасным вообще, я хочу, чтобы только мой сервер мог использовать прокси-сервер изображений, и поскольку такой хэш в URL-адресе может быть лучшим вариантом?
http://img.ruphp.com/php/image.jpg&hash=hashhere
Я думал об использовании:
md5($_GET['img']."privatekeyhere");
Тогда моя проблема обратилась к тому, как я поместил закрытый ключ в код javascript без доступа всего мира к нему?
Любая помощь очень ценится.
С тех пор я написал этот сценарий, который несколько эффективен, но все еще открыт для обхода:
<?php $args = $_GET['q']; $date = date('mdYh-i', time()); list($hash,$img,$auth) = explode("/", $args); if($hash=="need" && $auth=="key"){ $checksum = md5($img.$date); echo $checksum; } if($hash==md5($img.$date)) { header('Content-Type: image/png'); echo file_get_contents('http://userserve-ak.last.fm/serve/64s/' . $img); } ?>
Это можно назвать так: http://img.ruphp.com/php/76030502.png/key
Затем код auth можно подключить, чтобы отобразить изображение: http://img.ruphp.com/php/76030502.png
Однако кому-то не хватает времени, чтобы выяснить, что они могут настроить скрипт для голосования за ключ каждую минуту – любой совет?
Создавайте уникальные маркеры. Вы на правильном пути с хешем, но если вы сохраните свой секретный ключ, он в конечном итоге станет грубым. Оттуда, радужные столы говорят привет.
Фактически вам придется заимствовать лист или два из механизмов, используемых для предотвращения злоупотребления CSRF, поскольку вы пытаетесь сделать то же самое: ограничьте пользователя одним запросом на токен, с токеном, который не может быть восстановлен их.
Есть много способов сделать это, и обычный компромисс между эффективностью и безопасностью. Самое простое – это то, что вы предложили – это легко грубой силой. На противоположном конце спектра используется подход БД – генерировать уникальный токен за посещение, хранить его в БД и проверять последующие вызовы против этого. Он довольно интенсивный DB, но работает относительно хорошо – и практически невозможно сломать, если генерация токена невелика.