Можно ли достоверно знать, откуда возник HTTP-запрос без сценариев? - PullRequest
2 голосов
/ 08 августа 2011

Мне было поручено подать файл изображения с нашего сервера, на который есть ссылка в html-документе, находящемся на ряде других серверов.То есть:

файл на foo.com:
<img src='http://bar.com/image.jpg'>

Когда пользователь заходит на foo.com, он отображает изображение с нашего сервера bar.com.(На самом деле он отправляет другое изображение в зависимости от того, какой веб-сайт отправил запрос.)

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

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

Было бы лучше не запускать javascript или php, но это то, что нам нужно, даже без сценариев?

Если нет, то есть ли способ сделать это, используя только javascript таким образом, чтобы другой сайт не мог подделать свой путь при загрузке файла?

Если нет, то как бывы подходите к нему с помощью PHP?

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Короче, нет.Единственная надежная информация, которую вы имеете, - это IP-адрес, который запросил изображение, но даже это может быть прокси.Не существует надежного способа выяснить, в каком контексте было запрошено изображение (т. Е. В какую HTML-страницу встроено изображение).

То, что вы хотите, - это разрешить доступ только определенным людям кобраз.Есть два способа сделать это:

  • отфильтровать, запросив IP-адрес, если он известен
  • требует аутентифицированный заголовок сеанса / cookie / авторизации, т. Е. Пароль защищает изображение

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

(на стороне клиента) Javascript здесь вообще не будет полезен.

3 голосов
/ 08 августа 2011

Имеете ли вы какое-либо влияние на веб-приложения утвержденных компаний?Если это так, я могу придумать два способа сделать это.

Используя ваши примеры foo / bar, где bar.com - ваш сервер, а foo.com - одна из ваших утвержденных компаний:

1) Вместо того, чтобы браузер отправлял запрос на ваш сервер, пусть они отправят запрос обработчику изображений на foo.com, который, в свою очередь, отправляет HTTP-запрос на ваш сервер за кулисами и возвращает содержимое изображения обратно вклиент.Исходящий IP-адрес Foo будет находиться в белом списке на вашем сервере, поэтому все запросы фактически поступают с IP-адреса Foo.Клиент увидит:

<img src="http://foo.com/imagehandler.php" />

2) Гораздо сложнее, но если Foo не может сделать запрос к вашим серверам, Foo может поместить специальный хеш в строку запроса тега изображения, чтобы при браузереотправив запрос на ваш сервер, вы узнаете, что URL был создан Foo.Вам понадобится закрытый ключ на сервере Foo, чтобы он мог вычислить хеш.

Я думаю, хеш будет рассчитываться на основе комбинации IP-адреса браузера, текущей даты / времени изакрытый ключ.

Таким образом, браузер отправит запрос на foo.com/default.php, а Foo создаст следующий тег изображения для браузера:

<img src="http://bar.com/imagehandler.php?hash=393923A423B423F234C34" />

, где это число представляетсоответствующий хеш.В коде обработчика изображений Bar вам необходимо пересчитать этот хэш на основе закрытого ключа, который известен только Foo и Bar, IP-адреса, который является частью запроса GET, и текущей даты / времени.Если хеш совпадает, то вы можете быть уверены, что браузер просматривает веб-сайт foo.com, и вы можете вернуть содержимое изображения.

...