Mam witrynę ASP.NET 4.0 IIS7.5, którą muszę zabezpieczyć za pomocą nagłówka X-Frame-Options.
Muszę również umożliwić wyświetlanie ramek iframe na moich stronach witryny z mojej samej domeny, a także z mojej aplikacji Facebook.
Obecnie mam skonfigurowaną witrynę z witryną o nazwie:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Kiedy przeglądałem moją stronę na Facebooku w przeglądarce Chrome lub Firefox, moje strony (które są w ramce iframe z moją stroną na Facebooku) są wyświetlane poprawnie, ale w IE9 pojawia się błąd:
„nie można wyświetlić tej strony…” (z powodu
X-Frame_Options
ograniczenia).
Jak ustawić X-Frame-Options: ALLOW-FROM
obsługę więcej niż jednej domeny?
X-FRAME-OPTION
Bycie nową funkcją wydaje się zasadniczo wadliwe, jeśli można zdefiniować tylko jedną domenę.
Odpowiedzi:
X-Frame-Options
jest przestarzałe. Z MDN :Nowoczesną alternatywą jest
Content-Security-Policy
nagłówek, który wraz z wieloma innymi zasadami może zawierać białą listę adresów URL, które mogą hostować twoją stronę w ramce, przy użyciuframe-ancestors
dyrektywy.frame-ancestors
obsługuje wiele domen, a nawet symbole wieloznaczne, na przykład:Niestety, na razie Internet Explorer nie obsługuje w pełni Content-Security-Policy .
UPDATE: MDN usunął swój komentarz dotyczący wycofania. Oto podobny komentarz z poziomu polityki bezpieczeństwa treści W3C
źródło
X-Frame-Options
zmieniło się i jest teraz mniej surowe. Dobrze, że użycie specyfikacji, która nie została sfinalizowana, jest ryzykowne. Dzięki!X-Frame-Options
nie obsługuje wielu źródeł.Z RFC 7034 :
Więc,
Nie możesz. Aby obejść ten problem, możesz użyć różnych adresów URL dla różnych partnerów. Dla każdego adresu URL możesz użyć jego własnej
X-Frame-Options
wartości. Na przykład:Dla
yousite.com
można po prostu używaćX-Frame-Options: deny
.BTW , na razie Chrome (i wszystkie przeglądarki oparte na webkitach) w ogóle nie obsługuje
ALLOW-FROM
instrukcji.źródło
ALLOW-FROM
korzystanie z podanego linku.Nekromancja.
Podane odpowiedzi są niekompletne.
Po pierwsze, jak już powiedziano, nie można dodać wielu hostów z zezwoleniem, to nie jest obsługiwane.
Po drugie, musisz dynamicznie wyodrębnić tę wartość ze strony odsyłającej HTTP, co oznacza, że nie możesz dodać wartości do Web.config, ponieważ nie zawsze jest to ta sama wartość.
Konieczne będzie wykonanie wykrywania przeglądarki, aby uniknąć dodawania zezwalania z przeglądarki Chrome (powoduje to błąd w konsoli debugowania, która może szybko zapełnić konsolę lub spowolnić aplikację). Oznacza to również, że musisz zmodyfikować wykrywanie przeglądarki ASP.NET, ponieważ błędnie identyfikuje ona Edge jako Chrome.
Można to zrobić w ASP.NET, pisząc moduł HTTP, który działa na każde żądanie, który dołącza nagłówek http dla każdej odpowiedzi, w zależności od strony odsyłającej żądania. W przypadku Chrome musi dodać politykę bezpieczeństwa treści.
Musisz zarejestrować funkcję context_EndRequest w funkcji Init modułu HTTP.
Następnie musisz dodać moduł do swojej aplikacji. Możesz to zrobić programowo w Global.asax, zastępując funkcję Init HttpApplication, na przykład:
lub możesz dodać wpisy do Web.config, jeśli nie jesteś właścicielem kodu źródłowego aplikacji:
Wpis w system.webServer jest przeznaczony dla IIS7 +, drugi w system.web dla IIS 6.
Należy pamiętać, że należy ustawić runAllManagedModulesForAllRequests na true, aby działał poprawnie.
Ciąg znaków w typie ma format
"Namespace.Class, Assembly"
. Zauważ, że jeśli napiszesz swój zestaw w VB.NET zamiast w C #, VB utworzy domyślną przestrzeń nazw dla każdego projektu, więc twój ciąg będzie wyglądał jakJeśli chcesz uniknąć tego problemu, napisz bibliotekę DLL w języku C #.
źródło
Co powiesz na podejście, które nie tylko zezwala na wiele domen, ale także na domeny dynamiczne.
Przykładem użycia jest tutaj część aplikacji Sharepoint, która ładuje naszą witrynę w Sharepoint za pośrednictwem iframe. Problem polega na tym, że sharepoint ma dynamiczne subdomeny, takie jak https://yoursite.sharepoint.com . W przypadku IE musimy więc określić ALLOW-FROM https: //.sharepoint.com
Trudna sprawa, ale możemy to zrobić, znając dwa fakty:
Kiedy element iframe jest ładowany, sprawdza poprawność opcji X-Frame tylko przy pierwszym żądaniu. Po załadowaniu elementu iframe możesz poruszać się po nim, a nagłówek nie będzie sprawdzany w kolejnych żądaniach.
Ponadto, gdy ładowany jest element iframe, punktem odniesienia HTTP jest nadrzędny adres URL elementu iframe.
Możesz wykorzystać te dwa fakty po stronie serwera. W Rubim używam następującego kodu:
Tutaj możemy dynamicznie zezwalać na domeny oparte na domenie nadrzędnej. W takim przypadku zapewniamy, że host kończy się na sharepoint.com, chroniąc naszą witrynę przed przechwytywaniem kliknięć.
Bardzo chciałbym poznać opinie na temat tego podejścia.
źródło
/\.sharepoint\.com$/
Zgodnie ze specyfikacjami MDN ,
X-Frame-Options: ALLOW-FROM
nie jest obsługiwany w Chrome, a wsparcie jest nieznane w Edge i Opera.Content-Security-Policy: frame-ancestors
zastępujeX-Frame-Options
(zgodnie ze specyfikacją W3 ), aleframe-ancestors
ma ograniczoną kompatybilność. Zgodnie z tymi specyfikacjami MDN nie jest obsługiwany w IE ani Edge.źródło
Dokument RFC dla pola nagłówka HTTP X-Frame-Options stwierdza, że pole „ALLOW-FROM” w wartości nagłówka X-Frame-Options może zawierać tylko jedną domenę. Wiele domen jest niedozwolonych.
Dokument RFC sugeruje obejście tego problemu. Rozwiązaniem jest określenie nazwy domeny jako parametru url w adresie url src elementu iframe. Serwer, który obsługuje adres URL źródła iframe, może następnie sprawdzić nazwę domeny podaną w parametrach adresu URL. Jeśli nazwa domeny pasuje do listy prawidłowych nazw domen, serwer może wysłać nagłówek X-Frame-Options z wartością: „ALLOW-FROM nazwa-domeny”, gdzie nazwa domeny to nazwa domeny, która próbuje osadzić zdalną zawartość. Jeśli nazwa domeny nie została podana lub jest nieprawidłowa, wówczas nagłówek X-Frame-Options może zostać wysłany z wartością: „deny”.
źródło
Ściśle mówiąc nie, nie możesz.
Możesz jednak określić,
X-Frame-Options: mysite.com
a zatem zezwolić nasubdomain1.mysite.com
isubdomain2.mysite.com
. Ale tak, to wciąż jedna domena. Jest jakieś obejście tego problemu, ale myślę, że najłatwiej jest to przeczytać bezpośrednio w specyfikacjach RFC: https://tools.ietf.org/html/rfc7034Warto również zwrócić uwagę, że
frame-ancestor
dyrektywa nagłówka Content-Security-Policy (CSP) przestaje obowiązywać X-Frame-Options. Przeczytaj więcej tutaj .źródło
Niezupełnie to samo, ale może działać w niektórych przypadkach: istnieje inna opcja,
ALLOWALL
która skutecznie usunie ograniczenie, co może być przyjemne w przypadku środowisk testowych / przedprodukcyjnychźródło
Musiałem dodać X-Frame-Options dla IE i Content-Security-Policy dla innych przeglądarek. Więc zrobiłem coś takiego jak śledzenie.
źródło
Jednym z możliwych obejść byłoby użycie skryptu „frame-breaker”, jak opisano tutaj
Wystarczy zmienić instrukcję „if”, aby sprawdzić dozwolone domeny.
Myślę, że to obejście byłoby bezpieczne. ponieważ przy wyłączonym javascript nie będziesz mieć obaw o bezpieczeństwo w związku ze złośliwą witryną umieszczającą ramkę na Twojej stronie.
źródło
TAK. Ta metoda dopuszczała wiele domen.
VB.NET
źródło