Я создаю небольшую веб-страницу с использованием PHP, которая будет доступна как IFRAME из нескольких сайтов. Я хочу ограничить доступ к этому сайту, чтобы работать ТОЛЬКО на «одобренных» сайтах, а не на других сайтах или напрямую обращаться. У кого-нибудь есть предложения? Возможно ли это? PHP-сайт будет Apache, а сайты iframing контента, вероятно, будут .NET.
Чтобы уточнить, любой сайт может просматривать страницу, если это iframe'd на одобренном сайте. Я хочу заблокировать доступ людей к нему напрямую. Я думаю, что файлы cookie могут быть решением, но я не уверен.
К сожалению, это не будет возможным.
Используя Javascript, вы можете проверить, включена ли ваша страница в другой фрейм, но это не будет безупречным, поскольку Javascript можно отключить в некоторых браузерах.
Например, вы можете запустить следующий javascript, чтобы повторно просмотреть свою страницу, если это намерение:
if (top.location != location) { top.location.href = document.location.href ; }
Думая об этом … Я не уверен, что это абсолютно безопасно, но вот выстрел, пока я думаю об этом больше –
Единственный способ сделать это – это управлять сайтами, в которые он будет встроен. Если вы их контролируете, вы можете передать время, зашифрованное, из набора фреймов в фрейм:
<iframe src="http://yourdomain/frame.php?key=p21n9u234p8yfb8yfy234m3lunflb8hv" />
Затем frame.php расшифровывает сообщение, чтобы найти время в пределах небольшой дельта (скажем, 10 секунд). Поскольку frame.php знает, что только приемлемые сайты могли зашифровать время, он знает, что нормально отображать себя. В противном случае он ничего не выводит.
Все остальное, будь то javascript или HTTP_REFER, может быть подделано, отключено или обойдено.
И на самом деле, с этим URL-адресом, злоумышленник сможет показывать ваш кадр в любом месте, пока пользователь загрузит его в течение 10 секунд. Таким образом, злоумышленник просто очистит принятый сайт и возьмет ключ. Если эта модель угроз неприемлема для вас – тогда вы действительно ничего не можете сделать (кроме, быть может, еще более сложного протокола).
Я бы реализовал это так же, как Google Adwords AdSense. Вместо того, чтобы внедрить код iframe на свой сайт, вместо этого им нужно встроить некоторый javascript, который включает номер учетной записи:
<script type="text/javascript"><!-- myiframe_client = "12345"; myiframe_width = 728; myiframe_height = 90; //--> </script> <script type="text/javascript" src="http://www.example.com/scripts/show_iframe.js"> </script>
По крайней мере, таким образом вы можете управлять тем, кто отображает ваше содержимое iframe для каждой учетной записи. Если кто-то несанкционированно пытается использовать ваш iframe, вы можете отключить учетную запись. Вы также можете проверить свойства документа с помощью javascript (в пределах ограничений безопасности браузера), чтобы предотвратить несанкционированный доступ.
Скребок экрана может быть возможным решением здесь.
Настройте список доступа на своем сайте, чтобы принимать только запросы, поступающие с веб-серверов утвержденных сайтов, и выдавать им токен безопасности. Это легкая часть.
Команда разработчиков на своем конце должна будет настроить ретрансляционный сервлет, чтобы получить ваш контент, а затем отобразить его пользователям (после перезаписи любых соответствующих URL-адресов).
Это может быть довольно сложно, но вы бы лучше могли контролировать, кто обращается к сайту. Кроме того, любой маркер безопасности, который вы выдаете, не будет виден веб-пользователю, поскольку он должен передаваться только между двумя веб-серверами.
Вы можете MD5 (или зашифровать для лучшей защиты) IP-адрес клиента с помощью секретной соли + даты и передать это как параметр в url iframe src. В iframe вы делаете то же самое и проверяете, совпадает ли результат с параметром; если нет, запретить доступ
Не могли бы вы проверить $_SERVER['HTTP_REFERER']
чтобы убедиться, что он содержит определенную строку?
if (strpos('http://example.com', $_SERVER['HTTP_REFERER']) !== false) { // allowed }
В вашем случае вы можете сначала проанализировать адрес, а затем проверить, является ли in_array()
.
Это не будет доказательством дурака, так как люди могут подделывать реферера, НО, возможно, вы могли бы сделать какие-то 1 ключи использования с другой связью между двумя серверами. Если ключ был использован, то нет.
Спасибо за все замечательные идеи! Я думаю, что решение, с которым я собираюсь пойти, – это cookie сеанса, установленный одобренным сайтом iframing. Кто-то, кто действительно решил, все равно сможет получить контент, но я думаю, что я могу предотвратить большую часть злоупотреблений, придумав порядочный «секретный» алгоритм, основанный на каком-то секретном секрете с обеих сторон, и чтобы утвержденный сайт установил session cookie, который будет прочитан моим PHP-сайтом. Если файл cookie действителен и соответствует моим критериям, я покажу содержимое, иначе я не буду. Информация, которую я защищаю, не является критически важной, я просто пытаюсь предотвратить ее злоупотребление.