У меня есть сайт ASP.NET 4.0 IIS7.5, который мне нужно защитить с помощью заголовка X-Frame-Options.
Мне также нужно включить iframe для страниц моего сайта из моего домена и из моего приложения facebook.
В настоящее время на моем сайте настроен сайт с заголовком:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Когда я просматривал свою страницу Facebook с помощью Chrome или Firefox, страницы моих сайтов (которые были связаны с моей страницей facebook) отображаются нормально, но в IE9 я получаю сообщение об ошибке:
«эта страница не может быть отображена…» (из-за
X-Frame_Options
ограничения).
Как настроить X-Frame-Options: ALLOW-FROM
поддержку более одного домена?
X-FRAME-OPTION
новая функция кажется в корне ошибочной, если можно определить только один домен.
Ответы:
X-Frame-Options
устарела. Из MDN :Современная альтернатива - это
Content-Security-Policy
заголовок, который наряду со многими другими политиками может заносить в белый список URL-адреса, которым разрешено размещать вашу страницу во фрейме, с помощьюframe-ancestors
директивы.frame-ancestors
поддерживает несколько доменов и даже подстановочные знаки, например:К сожалению, на данный момент Internet Explorer не полностью поддерживает Content-Security-Policy .
ОБНОВЛЕНИЕ: MDN удалил свой устаревший комментарий. Вот аналогичный комментарий от уровня политики безопасности контента W3C.
источник
X-Frame-Options
изменилась и стала менее суровой. Хорошо, что использовать еще не завершенную спецификацию рискованно. Спасибо!X-Frame-Options
не поддерживает несколько источников.Из RFC 7034 :
Так,
Вы не можете. В качестве обходного пути вы можете использовать разные URL-адреса для разных партнеров. Для каждого URL вы можете использовать собственное
X-Frame-Options
значение. Например:Ибо
yousite.com
вы можете просто использоватьX-Frame-Options: deny
.Кстати , на данный момент Chrome (и все браузеры на основе webkit) вообще не поддерживает
ALLOW-FROM
инструкции.источник
ALLOW-FROM
использование предоставленной вами ссылки.Некромантинг.
Предоставленные ответы неполные.
Во-первых, как уже было сказано, вы не можете добавить несколько разрешенных хостов, это не поддерживается.
Во-вторых, вам нужно динамически извлекать это значение из HTTP-реферера, что означает, что вы не можете добавить значение в Web.config, потому что это не всегда одно и то же значение.
Будет необходимо выполнить обнаружение браузера, чтобы избежать добавления разрешения, когда браузер работает в Chrome (это вызывает ошибку в консоли отладки, которая может быстро заполнить консоль или замедлить работу приложения). Это также означает, что вам нужно изменить определение браузера ASP.NET, поскольку он ошибочно определяет Edge как Chrome.
Это можно сделать в ASP.NET, написав HTTP-модуль, который запускается при каждом запросе, который добавляет http-заголовок для каждого ответа, в зависимости от реферера запроса. Для Chrome необходимо добавить Content-Security-Policy.
Вам необходимо зарегистрировать функцию context_EndRequest в функции Init HTTP-модуля.
Далее вам нужно добавить модуль в ваше приложение. Вы можете сделать это программно в Global.asax, переопределив функцию Init HttpApplication, например:
или вы можете добавить записи в Web.config, если у вас нет исходного кода приложения:
Запись в system.webServer предназначена для IIS7 +, другая в system.web - для IIS 6.
Обратите внимание, что вам необходимо установить для runAllManagedModulesForAllRequests значение true, чтобы она работала правильно.
Строка в типе находится в формате
"Namespace.Class, Assembly"
. Обратите внимание, что если вы пишете свою сборку в VB.NET вместо C #, VB создает пространство имен по умолчанию для каждого проекта, поэтому ваша строка будет выглядеть какЕсли вы хотите избежать этой проблемы, напишите DLL на C #.
источник
Как насчет подхода, который позволяет не только использовать несколько доменов, но и динамические домены.
Пример использования здесь - часть приложения Sharepoint, которая загружает наш сайт внутри Sharepoint через iframe. Проблема в том, что sharepoint имеет динамические поддомены, такие как https://yoursite.sharepoint.com . Итак, для IE нам нужно указать ALLOW-FROM https: //.sharepoint.com
Дело непростое, но мы можем его решить, зная два факта:
Когда загружается iframe, он проверяет параметры X-Frame только при первом запросе. После загрузки iframe вы можете перемещаться по нему, и заголовок не проверяется при последующих запросах.
Кроме того, когда загружается iframe, HTTP-референт является URL-адресом родительского iframe.
Вы можете использовать эти два факта на стороне сервера. В Ruby я использую следующий код:
Здесь мы можем динамически разрешать домены на основе родительского домена. В этом случае мы гарантируем, что хост заканчивается на sharepoint.com, что защищает наш сайт от взлома.
Я хотел бы услышать отзывы об этом подходе.
источник
/\.sharepoint\.com$/
Согласно спецификациям MDN ,
X-Frame-Options: ALLOW-FROM
не поддерживается в Chrome, а поддержка в Edge и Opera неизвестна.Content-Security-Policy: frame-ancestors
отменяетX-Frame-Options
(согласно этой спецификации W3 ), ноframe-ancestors
имеет ограниченную совместимость. Согласно этим спецификациям MDN , он не поддерживается в IE или Edge.источник
RFC для поля заголовка HTTP X-Frame-Options утверждает, что поле «ALLOW-FROM» в значении заголовка X-Frame-Options может содержать только один домен. Использование нескольких доменов не допускается.
RFC предлагает решение этой проблемы. Решение состоит в том, чтобы указать имя домена в качестве параметра url в URL-адресе iframe src. Сервер, на котором размещен URL-адрес iframe src, может затем проверить доменное имя, указанное в параметрах URL-адреса. Если имя домена соответствует списку допустимых доменных имен, то сервер может отправить заголовок X-Frame-Options со значением: «ALLOW-FROM domain-name», где имя домена - это имя домена, который пытается встроить удаленный контент. Если имя домена не указано или недействительно, то заголовок X-Frame-Options может быть отправлен со значением: «deny».
источник
Строго говоря, нельзя.
Однако вы можете указать
X-Frame-Options: mysite.com
и, следовательно, разрешитьsubdomain1.mysite.com
иsubdomain2.mysite.com
. Но да, это все еще один домен. Для этого есть обходной путь, но я думаю, что проще всего прочитать это непосредственно в спецификациях RFC: https://tools.ietf.org/html/rfc7034Также стоит отметить, что
frame-ancestor
директива заголовка Content-Security-Policy (CSP) отменяет X-Frame-Options. Подробнее читайте здесь .источник
Не совсем то же самое, но может работать в некоторых случаях: есть еще один вариант,
ALLOWALL
который эффективно снимает ограничение, что может быть хорошей вещью для сред тестирования / подготовки к производству.источник
Мне пришлось добавить X-Frame-Options для IE и Content-Security-Policy для других браузеров. Итак, я сделал что-то вроде следующего.
источник
Одним из возможных обходных путей может быть использование сценария прерывания кадра, как описано здесь.
Вам просто нужно изменить оператор «if», чтобы проверить разрешенные домены.
Думаю, этот обходной путь был бы безопасным. потому что с отключенным javascript у вас не будет проблем с безопасностью, связанных с вредоносным веб-сайтом, который обрамляет вашу страницу.
источник
ДА. Этот метод позволяет использовать несколько доменов.
VB.NET
источник