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

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
c61
phpBB 2.0.6
Сообщения: 506
Стаж: 13 лет 10 месяцев
Благодарил (а): 42 раза
Поблагодарили: 251 раз

Безопасный ББ-код 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.su/forum/viewtopic.php?f=6&t=97
Тема на моей тестовой площадке: тынц
Аватара пользователя
dndn
phpBB 1.4.4
Сообщения: 131
Стаж: 14 лет 7 месяцев
Благодарил (а): 30 раз
Поблагодарили: 5 раз

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

Сообщение dndn »

Здравствуйте!

Есть необходимость размещать на форуме таблицы (Microsoft Excel *.xls или Openoffice Calc *.ods), сохраненные в google docs.

Вот пример таблицы, преобразованной в формат Google Sheets:

https://docs.google.com/spreadsheets/d/ ... 5oqIh1Jf3c

А вот непреобразованный на Google Drive:

https://drive.google.com/file/d/0B7DEek ... 3ZpSHFKWEE

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

P.S. Пробовал использовать для этой цели Ваш мод Просмотр вложений в Google Docs Viewer (gdocs). Результат - с помощью мода прекрасно открываются документы Word (*.doc), но при открытии таблиц (*.xls) возникает ошибка :(
Аватара пользователя
dndn
phpBB 1.4.4
Сообщения: 131
Стаж: 14 лет 7 месяцев
Благодарил (а): 30 раз
Поблагодарили: 5 раз

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

Сообщение dndn »

Может что-то не так, но решил таким бб-кодом:

Использование BBCode:

Код: Выделить всё

[gsheet]{TEXT}[/gsheet]
Эамена HTML:

Код: Выделить всё

<iframe src="https://docs.google.com/spreadsheets/d/{TEXT}" width="100%" height="600px"></iframe>
Постоянную часть адреса вбил "намертво" в тело бб-кода, а переменную оставил для пользователя. С точки зрения безопасности вроде должно быть нормально.

Вернуться в «Поддержка phpBB 3.0.х»