|
Поделиться

Безопасный ББ-код iframe для страниц своего сайта

Хаки, скрипты, BB-коды и другие вещи, не оформленные в виде полноценных модов, но способствующие улучшению функциональности движка.

Сообщение c61 » 30.03.14 16:51

Использование iframe в ББ-кодах для показа страниц сторонних сайтов в сообщениях вносит потенциальную уязвимость. Однако, порой возникает необходимость показать страницы своего сайта. В этом случае можно использовать следующий ББ-код:

Использование BBCode:
Код: Выделить всё
[iframe={RELATIVE_URL},{NUMBER}][/iframe]

Замена HTML:
Код: Выделить всё
<a href="{RELATIVE_URL}" target="_blank">{L_GO}: {RELATIVE_URL}</a>
<script type="text/javascript">
// <![CDATA[
if ( ( typeof bb_iframe_height != 'function' ) && ( typeof bb_iframe_accept != 'function' ) )
{
	function bb_iframe_height(f,h)
	{
		function bb_iframe_getCoords(f)
		{
			var box = f.getBoundingClientRect();

			var body = document.body;
			var docEl = document.documentElement;

			var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
			var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;

			var clientTop = docEl.clientTop || body.clientTop || 0;
			var clientLeft = docEl.clientLeft || body.clientLeft || 0;

			var top  = box.top + scrollTop - clientTop;
			var left = box.left + scrollLeft - clientLeft;

			return { "left": Math.round(left), "top": Math.round(top) };
		}

		var coords = bb_iframe_getCoords(f);
		
		if ( h )
		{
			var hf = h;
			if ( hf < 25 ) hf = 25;
			else if ( hf > 1000) hf = 1000;
			f.style.height = Math.round((hf*((document.compatMode=='CSS1Compat' && window.opera) ? (window.innerHeight) : (document.compatMode=='CSS1Compat' && !window.opera ? document.documentElement.clientHeight : document.body.clientHeight)))/100) + 'px';
		}
		else
		{
			var fd = f.contentDocument || f.contentWindow.document;
			f.style.height = Math.max(fd.documentElement.scrollHeight, fd.documentElement.clientHeight) + 'px';
			f.scrolling="no";
		}
		
		var p = f.previousSibling;
		while ( p )
		{
			if ( p.nodeType == 1 )
			{
				if ( (p.tagName == 'A') || ( p.tagName == 'a') )
				{
					p.style.display = 'none';
					break;
				}
			}
			p = p.previousSibling;
		}

		var newcoords = bb_iframe_getCoords(f);
		window.scrollBy(newcoords.left - coords.left, newcoords.top - coords.top);
	}
	function bb_iframe_accept(url)
	{
		if ( url.indexOf('/',0) != 0 ) return false;
		if ( decodeURIComponent(url).search(new RegExp('(http(s|)|ftp):\/\/','i')) != -1 ) return false;
		
		var iframe = false;
		try
		{
			iframe = (window != window.top) || (document != top.document) || (self.location != top.location);
		}
		catch (e)
		{
			iframe = true;
		}
		if ( iframe ) return false;
		return true;
	}
}

if ( bb_iframe_accept('{RELATIVE_URL}') )
{
	document.write('<iframe src="{RELATIVE_URL}" width="100%" height="100%" onload="javascript: bb_iframe_height(this,{NUMBER});" frameborder="0" hspace="0px" vspace="0px" marginheight="0px" marginwidth="0px"></iframe>');
}
// ]]>
</script>

Подсказка:
Код: Выделить всё
Внутренняя страница сайта в окне фрейма [iframe=адрес,относительная высота][/iframe]

Где:
  • адрес - внутренняя ссылка относительно корня сайта, начинающаяся с символа "/"
  • относительная высота (h) - параметр, задающий высоту окна окна фрейма; если h имеет нулевое значение, скрипт пытается отобразить окно полностью, что не всегда возможно; если окно отображается некорректно, используйте ненулевое h, значение которого соответствует высоте относительно родительского окна в процентах (рекомендуется задавать значение 80, то есть 4/5 высоты экрана); если значение h ненулевое и меньше 25, принимается значение 25, то есть 1/4 высоты экрана; если значение h больше 1000, принимается 1000
Примечания:
  • если адрес начинается не с символа "/" или содержит http, https, ftp или отключен javascript или имеет место вложение фреймов или фрейм в процессе загрузки, вместо окна фрейма отбражается ссылка
  • ББ-код совместим с модами Prime Links и hook_urlname
  • если Вы используете страницы своего сайта, на которых есть ссылки, открывающиеся в том же окне, то это, несомненно, вносит потенциальную уязвимость, поэтомк не следует использовать такие страницы или установить мод Prime Links с настройкой открытия внешних страниц в отдельной вкладке браузера
Пример см. по ссылке (для просмотра необходима регистрация или тестовый вход tester:tester): http://c61.no-ip.org/forum/viewtopic.php?f=6&t=97
Тема на моей тестовой площадке: тынц
Аватара пользователя
c61
Разработчик модов
 
Сообщения: 249
Зарегистрирован: 24.08.13 16:46

Сообщение Thinker » 25.04.14 07:41

Добрый день!
Все сделал как описано выше, теперь в списке BBCode, есть iframe.
У меня есть вот такой код всплывающего окна.
Код: Выделить всё
<iframe style="display: block; border: none; width: 850px; height: 1472px;" src="http://club.mirkasko.ru/new_integration/corolla.php"></iframe>

Не могу понять как его прикрутить.
В примечаниях написано, что
если адрес начинается не с символа "/" или содержит http, https, ftp или отключен javascript или имеет место вложение фреймов или фрейм в процессе загрузки, вместо окна фрейма отбражается ссылка

Все правильно, так и есть, вместо фрейма отображается ссылка.
Научите пожалуйста, что можно сделать в моем случае?
Thinker
 
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан

Сообщение c61 » 25.04.14 10:07

Если ссылка внешняя, то не стоит использовать iframe, ибо небезопасно... Если внутренняя - то вместо http://[/code] поставьте [icode]/. Вы не сказали, какая это ссылка.
Аватара пользователя
c61
Разработчик модов
 
Сообщения: 249
Зарегистрирован: 24.08.13 16:46

Сообщение Thinker » 25.04.14 10:31

Ссылка внешняя.
А что тогда делать, каким образом можно реализовать всплывающее окно, но что бы безопасно было?
Thinker
 
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан

Сообщение c61 » 25.04.14 11:31

С другого сайта безопасно не сделать... К сожалению.
Аватара пользователя
c61
Разработчик модов
 
Сообщения: 249
Зарегистрирован: 24.08.13 16:46

Сообщение Thinker » 25.04.14 12:57

c61, а в чем именно заключается опасность?
Может быть в некоторых случаях, если сайт на который ведет ссылка вызывает доверие, это безопасно?
Thinker
 
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан

Сообщение Thinker » 05.05.14 08:03

Прочел много информации, осознал всю опасность которую несут в себе бесконтрольные ББкоды, для форума.
Но ведь теоретически можно, сделать так, что бы ББкод "iframe" (с внешней ссылкой), имел право вставлять только Администратор?
Если это возможно, подскажите каким образом.
Thinker
 
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан


Вернуться в Расширение возможностей phpBB 3.0.x

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1