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

Хаки, скрипты, BB-коды и другие вещи, не оформленные в виде полноценных модов, но способствующие улучшению функциональности движка.
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

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

Сообщение c61 »

Использование 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
Тема на моей тестовой площадке: тынц
Thinker
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение Thinker »

Добрый день!
Все сделал как описано выше, теперь в списке 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 или имеет место вложение фреймов или фрейм в процессе загрузки, вместо окна фрейма отбражается ссылка
Все правильно, так и есть, вместо фрейма отображается ссылка.
Научите пожалуйста, что можно сделать в моем случае?
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

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

Сообщение c61 »

Если ссылка внешняя, то не стоит использовать iframe, ибо небезопасно... Если внутренняя - то вместо http://[/code] поставьте [icode]/. Вы не сказали, какая это ссылка.
Thinker
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение Thinker »

Ссылка внешняя.
А что тогда делать, каким образом можно реализовать всплывающее окно, но что бы безопасно было?
Аватара пользователя
c61
Разработчик модов
Сообщения: 249
Зарегистрирован: 24.08.13 16:46
Благодарил (а): 20 раз
Поблагодарили: 62 раза

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

Сообщение c61 »

С другого сайта безопасно не сделать... К сожалению.
Thinker
Сообщения: 21
Зарегистрирован: 10.04.14 14:21
Откуда: Казахстан
Благодарил (а): 1 раз
Контактная информация:

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

Сообщение Thinker »

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

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

Сообщение Thinker »

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