Защитить php-прокси?

Итак, на моем сайте (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

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

Related of "Защитить php-прокси?"

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

Фактически вам придется заимствовать лист или два из механизмов, используемых для предотвращения злоупотребления CSRF, поскольку вы пытаетесь сделать то же самое: ограничьте пользователя одним запросом на токен, с токеном, который не может быть восстановлен их.

Есть много способов сделать это, и обычный компромисс между эффективностью и безопасностью. Самое простое – это то, что вы предложили – это легко грубой силой. На противоположном конце спектра используется подход БД – генерировать уникальный токен за посещение, хранить его в БД и проверять последующие вызовы против этого. Он довольно интенсивный DB, но работает относительно хорошо – и практически невозможно сломать, если генерация токена невелика.