Проверка iframe вызывается из утвержденного домена?

Возможный дубликат:
Как ограничить отображение iframe с внешнего сайта только определенными доменами

То, что я хочу, просто. Я хочу, чтобы мой сайт не вызывался из доменов, которые я не одобрял. Допустим, только a.com и b.com могут иметь страницу с iframe, вызывающим мое веб-приложение wwww.mydomain.com/myapp.php. Как я могу это сделать?

Во-первых, я думал о том, что мое веб-приложение проверяет домен родителя iframe. Возможно, это возможно, но, конечно, нелегко из-за междоменных ограничений.

Во-вторых, я думал о том, чтобы запрашивающая страница на a.com и b.com сначала выполняла небольшой PHP-скрипт, который записывает некоторую информацию в файл или мою базу данных, поэтому я знаю, что запрашивающая страница находится на одном из утвержденных доменов. Вопрос как вызывать и когда выполнять скрипт?

Является ли размещение тега сценария или тега изображения с атрибутом src хорошей идеей? Для меня это выглядит довольно простым решением, и PHP не требуется. Запрашивающая страница может быть чистым HTML.

Должно ли это выглядеть так:

<img src="http://wwww.mydomain.com/myapp.php" style="width: 0px; height: 0px;" alt="Not an image"  title="Not an image"/>

Что посоветуете?


person RWC    schedule 18.05.2012    source источник


Ответы (4)


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

Ничего не нужно делать на одобренных доменах. Милая!

Благодаря dda и jackJoe (Как ограничить отображение iframe с внешнего сайта только определенными доменами )

<?php

  define('MSG_NO_ACCESS', 'No access');

  $acceptedDomains = array('mydomain.com', 'a.com', 'b.com');
  $referer=get_domain($_SERVER['HTTP_REFERER']);

  if(!$referer || !in_array($referer,$acceptedDomains))
  {
     header('HTTP/1.0 403 Forbidden');
     exit(MSG_NO_ACCESS);
  }

function get_domain($url)
{
  $pieces = parse_url($url);
  $domain = isset($pieces['host']) ? $pieces['host'] : '';
  if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) 
  {
     return $regs['domain'];
  }
  return false;
}

?>

person RWC    schedule 19.05.2012
comment
Что, если они подделают referrer? - person Jeremy; 20.11.2019
comment
Простой и рабочий. Спасибо. - person Tech; 26.03.2020

Этот вопрос уже задавался. Как ограничить отображение iframe с внешнего сайта только определенными доменами

В основном вы можете, в зависимости от вашего веб-сервера, вам нужно будет ограничить доступ.

С Apache это можно сделать в файле .htaccess.

В IIS это можно сделать в разделе «Ограничения IP-адреса и домена».

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

person will    schedule 18.05.2012
comment
Виноват. Прежде чем задавать свой вопрос, я должен сначала поискать. Но ваш ответ очень полезен. Спасибо. - person RWC; 19.05.2012

Небольшой PHP-инъектор JS может иметь большое значение.

<?php
if(array_key_exists('HTTP_REFERER',$_SERVER)){
  $referer=$_SERVER['HTTP_REFERER'];
} else {
  $referer='';
}
echo "<script type='text/javascript'>
var referer='".$referer."';
</script>
";
?>

Это добавит HTTP_REFERER в JS-переменную «referer». Теперь с этим и следующим кодом JS все готово:

if (top === self) {
// not in a frame, no worries
} else {
// in a frame, decide whether referer is one of the guys allowed to display your web site...
// nuke the content, redirect, display a goatsee pic, etc
}
person dda    schedule 18.05.2012

Вы ничего не можете сделать, чтобы предотвратить это. Любой, у кого есть прокси-сервер, может получить ваш HTML-код и повторно использовать его как свой собственный.

Правило № 1: если вы не хотите, чтобы люди воровали ваши материалы в Интернете, не размещайте их в Интернете.

person Diodeus - James MacFarlane    schedule 18.05.2012
comment
Я уверен, что вы правы. Возможно, я должен был сказать, чтобы обычный пользователь не мог просто позвонить на мой сайт в iframe. - person RWC; 19.05.2012