'X-Frame-Options'ı' SAMEORIGIN 'olarak ayarladığından bir çerçevede görüntülenmeyi reddetti


272

İnsanların telefonlarından erişebilmeleri için duyarlı olması gereken bir web sitesi geliştiriyorum. Sitede Google, Facebook, ... vb. (OAuth) kullanarak giriş yapabileceğiniz bazı güvenli bölümler var.

Sunucu arka ucu ASP.Net Web API 2 kullanılarak geliştirilmiştir ve ön uç çoğunlukla bazı Razor ile AngularJS'dir.

Kimlik doğrulama kısmı için, Android dahil tüm tarayıcılarda her şey iyi çalışıyor, ancak Google kimlik doğrulaması iPhone'da çalışmıyor ve bana bu hata mesajını veriyor

Refused to display 'https://accounts.google.com/o/openid2/auth
?openid.ns=http://specs.openid.ne…tp://axschema.org/namePerson
/last&openid.ax.required=email,name,first,last'
in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

Şimdiye kadar HTML dosyalarımda iframe kullanmıyorum diye endişeleniyorum.

Etrafımda dolaştım, ancak hiçbir yanıt sorunu çözmemi sağladı.


iframe'ler bazen görünür olmasa bile bağlandığınız servisler tarafından kullanılıyor (ilk görüşte)
NoWomenNoCry

Yanıtlar:


171

Ben belki birileri yerine yardımcı olabilir, daha iyi bir çözüm buldum "watch?v="tarafından "v/"ve işe yarayacak

var url = url.replace("watch?v=", "v/");

51
Ayrıca, "v /" yerine "embed /" kullanmak için bunu değiştirebilirsiniz, böylece tam URL şu şekilde olur:<iframe width='1080' height='760' src="https://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" allowfullscreen></iframe>
backwardm

1
i için bu yanıtınızı değiştirmek önermek "gömmek /" "v /" artık çalışmıyor çünkü
tm81

88

Tamam bu SO yazı yardımıyla daha fazla zaman geçirdikten sonra

"Ekran X-Frame-Options tarafından yasaklandı"

&output=embedGoogle URL'sine göndermeden önce URL'nin sonuna ekleyerek sorunu çözmeyi başardım :

var url = data.url + "&output=embed";
window.location.replace(url);

1
Aslında bu benim orijinal yazımda belirttiğim gibi OAUTH içindir. ve hala OAUTH 2.0'da. Bununla birlikte, Google hizmeti kullanmak için ayarlarını değiştirdi, bu yüzden şimdi özellikle OAUTH 2.0'ı kullanmak için bazı özellikleri değiştirmeniz gerekecek ve bu OWIN 3.0 ara katman yazılımında durum böyle. "Access_denied" hata mesajı alıyorsanız bu bağlantıya başvurun. blogs.msdn.com/b/webdev/archive/2014/07/02/…
Ali Hmer

1
@AliHmer Çok teşekkürler dostum. Günümü kurtardın :) & output = embed benim için aa cazibesi gibi çalıştı .. :)
Sahil Manchanda

1
Uygulama web görünümünde Google-takvim iframe için de çalışmaz.
NoBugs


35

Bu durumda üstbilgiyi SAMEORIGIN olarak belirlediler. Bu nedenle, bu iframe alanlar arası görüntüleyemez

resim açıklamasını buraya girin

Bu amaçla, apache'nizdeki konumu veya kullandığınız diğer hizmetleri eşleştirmeniz gerekir

Apache kullanıyorsanız httpd.conf dosyasında.

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>

2
Nedir your_relative_path?
Yeşil

2
Bu sizin_relatif_yolunuz nedir?
Sobiaholic


11

Youtube videosunu angularjs sayfanıza yerleştirmek için videonuz için aşağıdaki filtreyi kullanabilirsiniz

app.filter('scrurl', function($sce) {
    return function(text) {
        text = text.replace("watch?v=", "embed/");
        return $sce.trustAsResourceUrl(text);
    };
});
<iframe class="ytplayer" type="text/html" width="100%" height="360" src="{{youtube_url | scrurl}}" frameborder="0"></iframe>


7

Aşağıdaki değişiklikleri yaptım ve benim için iyi çalışıyor.

Sadece özelliği ekleyin <iframe src="URL" target="_parent" />

_parent: bu gömülü sayfayı aynı pencerede açar.

_blank: Farklı sekmede


1
Orijinal sorunun cevabının ne kadar alakalı olduğunu bilmiyorum, ama benim durumumda, farklı bir bağlamda, çözüm sağladı
Éric Viala

4

Benim için düzeltme, console.developer.google.com adresine gitmek ve uygulama etki alanını OAuth 2 kimlik bilgilerinin "Javascript Origins" bölümüne eklemekti.


2

Biraz geç, ancak bir native application Client IDyerine bir kullanırsanız bu hata da oluşabilir web application Client ID.


Ne demek istiyorsun? Çerçevenin bir Safari penceresinde çalıştığını, ancak bir uygulamanın web görünümünün iframe'inde çalışmadığını da fark ettim, ancak bunu nasıl değiştirirsiniz?
NoBugs

Sorunum benzerdi, web uygulaması Müşteri Kimliği yaparken web
sitemin uris'lerini

2

Aynı sorunu Açısal 9'da uyguluyordum. Yaptığım iki adım:

  1. YouTube URL'nizi olarak https://youtube.com/your_codedeğiştirin https://youtube.com/embed/your_code.

  2. Ve sonra URL'yi DomSanitizerAngular üzerinden geçirin.

    import { Component, OnInit } from "@angular/core";
    import { DomSanitizer } from '@angular/platform-browser';
    
    @Component({
      selector: "app-help",
      templateUrl: "./help.component.html",
      styleUrls: ["./help.component.scss"],
    })
    export class HelpComponent implements OnInit {
    
      youtubeVideoLink: any = 'https://youtube.com/embed/your_code'
    
      constructor(public sanitizer: DomSanitizer) {
        this.sanitizer = sanitizer;   
      }
    
      ngOnInit(): void {}
    
      getLink(){
        return this.sanitizer.bypassSecurityTrustResourceUrl(this.youtubeVideoLink);
      }
    
    }
    <iframe width="420" height="315" [src]="getLink()" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

1

Benim için işe yarayan, ebeveynine atıfta bulunan bir çözüm var. Google kimlik doğrulama sayfasına yönlendirilecek URL'yi aldıktan sonra aşağıdaki kodu deneyebilirsiniz:

var loc = redirect_location;      
window.parent.location.replace(loc);

0

Soru için teşekkürler. YouTube iframe için ilk sorun, verdiğiniz URL'dir, adres çubuğundan gömülü URL veya URL bağlantısıdır. gömülü olmayan URL için bu hata, ancak gömülü olmayan URL vermek istiyorsanız, "güvenli Boru" gibi (hem gömülü olmayan hem de gömülü URL için) kodlamanız gerekir:

import {Pipe, PipeTransform} from '@angular/core';
import {DomSanitizer} from '@angular/platform-browser';

@Pipe({name: 'safe'})
export class SafePipe implements PipeTransform {

constructor(private sanitizer: DomSanitizer) {

}

transform(value: any, url: any): any {
    if (value && !url) {
        const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
        let match = value.match(regExp);
        if (match && match[2].length == 11) {
            console.log(match[2]);
            let sepratedID = match[2];
            let embedUrl = '//www.youtube.com/embed/' + sepratedID;
            return this.sanitizer.bypassSecurityTrustResourceUrl(embedUrl);
        }

     }

   }
}

"vedioId" 'ı ayıracaktır. Video kimliğini almanız ve ardından URL olarak katıştırılmış olarak ayarlamanız gerekir. Html'de

 <div>
   <iframe width="100%" height="300" [src]="video.url | safe"></iframe>
 </div>

Açısal 2/5 tekrar teşekkürler.


0

URL Soneki ile aşağıdakileri ekleyin

/override-http-headers-default-settings-x-frame-options

0

Benzer bir sorun youtube sohbet gömme vardı ve ben anladım. Belki de benzer sorun için benzer bir çözüm var.

Refused to display 'https://www.youtube.com/live_chat?v=yDc9BonIXXI&embed_domain=your.domain.web' in a frame because it set 'X-Frame-Options' to 'sameorigin'

Web sayfam www ile ve onsuz çalışır. Bu yüzden çalışması için embed_domain = değerinde listelenen değeri yüklediğinizden emin olmanız gerekir ... Belki de iframe'inizi nereye yerleştireceğinizi söyleyecek bir değişken vardır. Sorunumu düzeltmek için doğru web sayfasını tespit etmek ve uygun iframe gömme etki alanı adını yürütmek için bir komut dosyası yazmak zorunda kaldı.

<iframe src='https://www.youtube.com/live_chat?v=yDc9BonIXXI&embed_domain=your.domain.web' width="100%" height="600" frameborder='no' scrolling='no'></iframe>

veya

<iframe src='https://www.youtube.com/live_chat?v=yDc9BonIXXI&embed_domain=www.your.domain.web' width="100%" height="600" frameborder='no' scrolling='no'></iframe>

İframe'leri kullanmadığınızı anlayın, ancak komut dosyasının nerede kullanılacağını söylemek için sözdiziminize eklemeniz gereken bazı değişkenler olabilir.


-1

Farklı etki alanlarına sahip alt sitelerin oturumunu kapatmak için iframe kullanırken bu benzer sorunla karşılaştım. Kullandığım çözüm önce iframe'i yüklemek, ardından çerçeve yüklendikten sonra kaynağı güncellemektir.

var frame = document.createElement('iframe');
frame.style.display = 'none';
frame.setAttribute('src', 'about:blank');
document.body.appendChild(frame);
frame.addEventListener('load', () => {
  frame.setAttribute('src', url);
});


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.