एक्स-फ्रेम-ऑप्शंस अनुमति-एकाधिक डोमेन से


99

मेरे पास ASP.NET 4.0 IIS7.5 साइट है जिसे मुझे X- फ्रेम-ऑप्शंस हेडर का उपयोग करके सुरक्षित करने की आवश्यकता है।

मुझे अपने साइट पृष्ठों को अपने उसी डोमेन से और साथ ही अपने फेसबुक ऐप से iframed करने की आवश्यकता है।

वर्तमान में मैंने अपनी साइट को एक साइट के साथ कॉन्फ़िगर किया है:

Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")

जब मैंने अपने फेसबुक पेज को क्रोम या फ़ायरफ़ॉक्स के साथ देखा तो मेरी साइट के पेज (मेरे फेसबुक पेज पर iframed होने के कारण) ठीक हैं, लेकिन IE9 के तहत, मुझे त्रुटि मिलती है:

"यह पृष्ठ प्रदर्शित नहीं किया जा सकता है ..." ( X-Frame_Optionsप्रतिबंध के कारण)।

मैं X-Frame-Options: ALLOW-FROMएक से अधिक डोमेन का समर्थन करने के लिए कैसे निर्धारित करूं ?

X-FRAME-OPTION एक नई विशेषता होने के नाते मौलिक रूप से त्रुटिपूर्ण लगता है यदि केवल एक ही डोमेन को परिभाषित किया जा सकता है।


2
यह एक ज्ञात सीमा लगती है: owasp.org/index.php/…
पियरे अर्न्स्ट

जवाबों:


108

X-Frame-Optionsपदावनत किया गया है। से MDN :

यह सुविधा वेब मानकों से हटा दी गई है। हालांकि कुछ ब्राउज़र अभी भी इसका समर्थन कर सकते हैं, यह गिराए जाने की प्रक्रिया में है। पुराने या नए प्रोजेक्ट्स में इसका इस्तेमाल न करें। इसका उपयोग करने वाले पृष्ठ या वेब एप्लिकेशन किसी भी समय टूट सकते हैं।

आधुनिक विकल्प Content-Security-Policyहेडर है, जो कई अन्य नीतियों के साथ frame-ancestorsनिर्देशन का उपयोग करके URL को फ्रेम में आपके पृष्ठ को होस्ट करने की अनुमति देता है ।
frame-ancestorsउदाहरण के लिए कई डोमेन और यहां तक ​​कि वाइल्डकार्ड का समर्थन करता है:

Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;

दुर्भाग्य से, अब के लिए, इंटरनेट एक्सप्लोरर सामग्री-सुरक्षा-नीति का पूरी तरह से समर्थन नहीं करता है

अद्यतन: एमडीएन ने उनकी पदावनति टिप्पणी को हटा दिया है। यहां W3C की सामग्री सुरक्षा नीति स्तर से समान टिप्पणी दी गई है

frame-ancestorsनिर्देश obsoletesX-Frame-Options हैडर। यदि किसी संसाधन में दोनों नीतियां हैं, तो frame-ancestorsनीति को लागू किया जाना चाहिए और X-Frame-Optionsनीति की अनदेखी की जानी चाहिए।


14
MDN पर फ़्रेम-पूर्वजों को "प्रयोगात्मक API और उत्पादन कोड में उपयोग नहीं किया जाना चाहिए" के रूप में चिह्नित किया गया है। + X- फ्रेम-ऑप्शंस को अपग्रेड नहीं किया गया है, लेकिन "गैर-मानक" लेकिन "व्यापक रूप से समर्थित है और सीएसपी के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है"
जोनाथन मुलर

1
@JonathanMuller - X-Frame-Optionsबदला हुआ शब्द , और अब कम गंभीर है। यह एक अच्छी बात है कि यह एक युक्ति का उपयोग करने के लिए जोखिम भरा है जिसे अंतिम रूप नहीं दिया गया है। धन्यवाद!
कोबी

2
मैं एमडीएन पर किसी भी अधिक चेतावनी को सही नहीं पा सकता हूं। क्या मोज़िला ने अपनी राय बदल दी है?
thomaskonrad

2
@ to0om - धन्यवाद! मैंने एक और टिप्पणी के साथ उत्तर को अपडेट किया। मैं अपने जवाब में बहुत मजबूत हो सकता है। किसी भी तरह से, X-Frame-Optionsकई स्रोतों का समर्थन नहीं करता है।
कोबी

4
@ कोबी, मुझे लगता है कि उत्तर को फिर से व्यवस्थित करने की आवश्यकता है। पहले ही वाक्य में कहा गया है कि यह MDN के अनुसार घटाया गया है। यदि आप शीर्ष पर अपने अद्यतन को जोड़ते हैं तो यह कम भ्रामक होगा (बोल्ड रंग "UPDATE:")। धन्यवाद।
कसुन गजसिंघे

39

से आरएफसी 7034 :

वाइल्डकार्ड या सूचियों को एक से अधिक डोमेन में घोषित करने की अनुमति नहीं है

इसलिए,

मैं एक से अधिक डोमेन का समर्थन करने के लिए एक्स-फ्रेम-विकल्प: ALLOW-FROM कैसे सेट करूं?

आप नहीं कर सकते। वर्कअराउंड के रूप में आप विभिन्न भागीदारों के लिए विभिन्न URL का उपयोग कर सकते हैं। प्रत्येक URL के लिए आप अपने स्वयं के X-Frame-Optionsमूल्य का उपयोग कर सकते हैं । उदाहरण के लिए:

partner   iframe URL       ALLOW-FROM
---------------------------------------
Facebook  fb.yoursite.com  facebook.com
VK.COM    vk.yoursite.com  vk.com

yousite.comआप के लिए बस का उपयोग कर सकते हैं X-Frame-Options: deny

BTW , अभी के लिए Chrome (और सभी वेबकिट-आधारित ब्राउज़र) स्टेटमेंट का समर्थन नहीं करता है ALLOW-FROM


1
ऐसा लगता है कि वेबकिट अब ALLOW-FROMआपके द्वारा दिए गए लिंक का उपयोग करके समर्थन करता है ।
जिमी

3
@ जिमी नहीं, यह प्रश्न में लिंक पर अंतिम टिप्पणी नहीं है, कहते हैं कि आपको इसके बजाय सीएसपी नीति का उपयोग करने की आवश्यकता है। यह विकल्प अभी भी क्रोम में काम नहीं करता है।
निकल

9

Necromancing।
प्रदान किए गए उत्तर अपूर्ण हैं।

सबसे पहले, जैसा कि पहले ही कहा गया है, आप मेजबान से कई अनुमति नहीं जोड़ सकते हैं, यह समर्थित नहीं है।
दूसरा, आपको उस मान को HTTP रेफ़रर से गतिशील रूप से निकालने की आवश्यकता है, जिसका अर्थ है कि आप Web.config में मान नहीं जोड़ सकते, क्योंकि यह हमेशा समान मान नहीं है।

अनुमति देने से बचने के लिए ब्राउज़र-डिटेक्शन करना आवश्यक होगा, जब ब्राउज़र क्रोम हो (यह डीबग - कंसोल पर एक त्रुटि पैदा करता है, जो कंसोल को जल्दी से भर सकता है, या एप्लिकेशन को धीमा कर सकता है)। इसका मतलब यह भी है कि आपको ASP.NET ब्राउज़र डिटेक्शन को संशोधित करने की आवश्यकता है, क्योंकि यह एज को क्रोम के रूप में गलत तरीके से पहचानता है।

यह ASP.NET में HTTP-मॉड्यूल लिखकर किया जा सकता है जो कि हर अनुरोध पर चलता है, जो अनुरोध के संदर्भ के आधार पर हर प्रतिक्रिया के लिए एक http-शीर्षलेख जोड़ता है। Chrome के लिए, उसे सामग्री-सुरक्षा-नीति को जोड़ना होगा।

// /programming/31870789/check-whether-browser-is-chrome-or-edge
public class BrowserInfo
{

    public System.Web.HttpBrowserCapabilities Browser { get; set; }
    public string Name { get; set; }
    public string Version { get; set; }
    public string Platform { get; set; }
    public bool IsMobileDevice { get; set; }
    public string MobileBrand { get; set; }
    public string MobileModel { get; set; }


    public BrowserInfo(System.Web.HttpRequest request)
    {
        if (request.Browser != null)
        {
            if (request.UserAgent.Contains("Edge")
                && request.Browser.Browser != "Edge")
            {
                this.Name = "Edge";
            }
            else
            {
                this.Name = request.Browser.Browser;
                this.Version = request.Browser.MajorVersion.ToString();
            }
            this.Browser = request.Browser;
            this.Platform = request.Browser.Platform;
            this.IsMobileDevice = request.Browser.IsMobileDevice;
            if (IsMobileDevice)
            {
                this.Name = request.Browser.Browser;
            }
        }
    }


}


void context_EndRequest(object sender, System.EventArgs e)
{
    if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)
    {
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;

        try
        {
            // response.Headers["P3P"] = "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"":
            // response.Headers.Set("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
            // response.AddHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");
            response.AppendHeader("P3P", "CP=\\\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\\\"");

            // response.AppendHeader("X-Frame-Options", "DENY");
            // response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
            // response.AppendHeader("X-Frame-Options", "AllowAll");

            if (System.Web.HttpContext.Current.Request.UrlReferrer != null)
            {
                // "X-Frame-Options": "ALLOW-FROM " Not recognized in Chrome 
                string host = System.Web.HttpContext.Current.Request.UrlReferrer.Scheme + System.Uri.SchemeDelimiter
                            + System.Web.HttpContext.Current.Request.UrlReferrer.Authority
                ;

                string selfAuth = System.Web.HttpContext.Current.Request.Url.Authority;
                string refAuth = System.Web.HttpContext.Current.Request.UrlReferrer.Authority;

                // SQL.Log(System.Web.HttpContext.Current.Request.RawUrl, System.Web.HttpContext.Current.Request.UrlReferrer.OriginalString, refAuth);

                if (IsHostAllowed(refAuth))
                {
                    BrowserInfo bi = new BrowserInfo(System.Web.HttpContext.Current.Request);

                    // bi.Name = Firefox
                    // bi.Name = InternetExplorer
                    // bi.Name = Chrome

                    // Chrome wants entire path... 
                    if (!System.StringComparer.OrdinalIgnoreCase.Equals(bi.Name, "Chrome"))
                        response.AppendHeader("X-Frame-Options", "ALLOW-FROM " + host);    

                    // unsafe-eval: invalid JSON https://github.com/keen/keen-js/issues/394
                    // unsafe-inline: styles
                    // data: url(data:image/png:...)

                    // https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet
                    // https://www.ietf.org/rfc/rfc7034.txt
                    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
                    // https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

                    // /programming/10205192/x-frame-options-allow-from-multiple-domains
                    // https://content-security-policy.com/
                    // http://rehansaeed.com/content-security-policy-for-asp-net-mvc/

                    // This is for Chrome:
                    // response.AppendHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.msecnd.net vortex.data.microsoft.com " + selfAuth + " " + refAuth);


                    System.Collections.Generic.List<string> ls = new System.Collections.Generic.List<string>();
                    ls.Add("default-src");
                    ls.Add("'self'");
                    ls.Add("'unsafe-inline'");
                    ls.Add("'unsafe-eval'");
                    ls.Add("data:");

                    // http://az416426.vo.msecnd.net/scripts/a/ai.0.js

                    // ls.Add("*.msecnd.net");
                    // ls.Add("vortex.data.microsoft.com");

                    ls.Add(selfAuth);
                    ls.Add(refAuth);

                    string contentSecurityPolicy = string.Join(" ", ls.ToArray());
                    response.AppendHeader("Content-Security-Policy", contentSecurityPolicy);
                }
                else
                {
                    response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
                }

            }
            else
                response.AppendHeader("X-Frame-Options", "SAMEORIGIN");
        }
        catch (System.Exception ex)
        {
            // WTF ? 
            System.Console.WriteLine(ex.Message); // Suppress warning
        }

    } // End if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Response != null)

} // End Using context_EndRequest


private static string[] s_allowedHosts = new string[] 
{
     "localhost:49533"
    ,"localhost:52257"
    ,"vmcompany1"
    ,"vmcompany2"
    ,"vmpostalservices"
    ,"example.com"
};


public static bool IsHostAllowed(string host)
{
    return Contains(s_allowedHosts, host);
} // End Function IsHostAllowed 


public static bool Contains(string[] allowed, string current)
{
    for (int i = 0; i < allowed.Length; ++i)
    {
        if (System.StringComparer.OrdinalIgnoreCase.Equals(allowed[i], current))
            return true;
    } // Next i 

    return false;
} // End Function Contains 

आपको HTTP- मॉड्यूल इनिट फ़ंक्शन में Reference_EndRequest फ़ंक्शन को पंजीकृत करने की आवश्यकता है।

public class RequestLanguageChanger : System.Web.IHttpModule
{


    void System.Web.IHttpModule.Dispose()
    {
        // throw new NotImplementedException();
    }


    void System.Web.IHttpModule.Init(System.Web.HttpApplication context)
    {
        // /programming/441421/httpmodule-event-execution-order
        context.EndRequest += new System.EventHandler(context_EndRequest);
    }

    // context_EndRequest Code from above comes here


}

आगे आपको अपने एप्लिकेशन में मॉड्यूल जोड़ना होगा। आप या तो इस प्रोग्राम को Global.asax में HttpApplication के Init फ़ंक्शन को ओवरराइड करके कर सकते हैं, जैसे:

namespace ChangeRequestLanguage
{


    public class Global : System.Web.HttpApplication
    {

        System.Web.IHttpModule mod = new libRequestLanguageChanger.RequestLanguageChanger();

        public override void Init()
        {
            mod.Init(this);
            base.Init();
        }



        protected void Application_Start(object sender, System.EventArgs e)
        {

        }

        protected void Session_Start(object sender, System.EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, System.EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, System.EventArgs e)
        {

        }

        protected void Application_Error(object sender, System.EventArgs e)
        {

        }

        protected void Session_End(object sender, System.EventArgs e)
        {

        }

        protected void Application_End(object sender, System.EventArgs e)
        {

        }


    }


}

या यदि आप अनुप्रयोग स्रोत-कोड के स्वामी नहीं हैं, तो आप Web.config में प्रविष्टियाँ जोड़ सकते हैं:

      <httpModules>
        <add name="RequestLanguageChanger" type= "libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />
      </httpModules>
    </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>

    <modules runAllManagedModulesForAllRequests="true">
      <add name="RequestLanguageChanger" type="libRequestLanguageChanger.RequestLanguageChanger, libRequestLanguageChanger" />
    </modules>
  </system.webServer>
</configuration>

System.webServer में प्रविष्टि IIS7 + के लिए है, दूसरा system.web IIS 6 के लिए है।
ध्यान दें कि आपको runAllManagedModulesForAllRequests को सही पर सेट करने की आवश्यकता है, इसके लिए यह ठीक से काम करता है।

प्रकार में स्ट्रिंग प्रारूप में है "Namespace.Class, Assembly"। ध्यान दें कि यदि आप C # के बजाय VB.NET में अपनी असेंबली लिखते हैं, तो VB प्रत्येक प्रोजेक्ट के लिए एक डिफ़ॉल्ट-नेमस्पेस बनाता है, जिससे आपका स्ट्रिंग कैसा दिखेगा

"[DefaultNameSpace.Namespace].Class, Assembly"

यदि आप इस समस्या से बचना चाहते हैं, तो DLL को C # में लिखें।


मुझे लगता है कि आप उत्तर से 'vmswisslife' और 'vmraiffeisen' निकालना चाहते हैं, इसलिए इसे गलत सहसंबंध नहीं मिलेगा।
quetzalcoatl

@quetzalcoatl: मैंने उन्हें एक उदाहरण के रूप में वहां छोड़ दिया, यह एक निरीक्षण नहीं है, यह किसी भी तरह से गोपनीय नहीं है। लेकिन सच है, शायद बेहतर उन्हें हटा दें। किया हुआ।
स्टेफेन स्टीगर

7

ऐसे दृष्टिकोण के बारे में जो न केवल कई डोमेन की अनुमति देता है, बल्कि गतिशील डोमेन की अनुमति देता है।

यहां उपयोग का मामला एक शेयरपॉइंट ऐप के हिस्से के साथ है जो कि शेयर पॉइंट के अंदर हमारी साइट को एक iframe के माध्यम से लोड करता है। समस्या यह है कि शेयरपॉइंट में डायनामिक सबडोमेनस जैसे https://yoursite.sharepoint.com है । इसलिए IE के लिए, हमें ALLOW-FROM https: //.sharepoint.com निर्दिष्ट करना होगा

मुश्किल काम, लेकिन हम इसे दो तथ्यों को जानकर कर सकते हैं:

  1. जब एक iframe लोड होता है, तो यह केवल पहले अनुरोध पर X- फ़्रेम-विकल्प को मान्य करता है। एक बार iframe लोड होने के बाद, आप iframe के भीतर नेविगेट कर सकते हैं और हेडर को बाद के अनुरोधों पर चेक नहीं किया जाता है।

  2. इसके अलावा, जब एक iframe लोड किया जाता है, HTTP रेफ़र पैरेंट iframe url है।

आप इन दो तथ्यों सर्वर साइड का लाभ उठा सकते हैं। रूबी में, मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

  uri = URI.parse(request.referer)
  if uri.host.match(/\.sharepoint\.com$/)
    url = "https://#{uri.host}"
    response.headers['X-Frame-Options'] = "ALLOW-FROM #{url}"
  end

यहां हम मूल रूप से मूल डोमेन के आधार पर डोमेन की अनुमति दे सकते हैं। इस स्थिति में, हम यह सुनिश्चित करते हैं कि हमारी साइट को क्लिकजैकिंग से सुरक्षित रखने के लिए hostpoint.com में समाप्त होता है।

मुझे इस दृष्टिकोण पर प्रतिक्रिया सुनना अच्छा लगेगा।


2
सावधानी: यह टूट जाता है यदि होस्ट "fakesharepoint.com" है। रेगेक्स होना चाहिए:/\.sharepoint\.com$/
निटास

@StefanSteiger यह सही है, लेकिन Chrome को भी इस समस्या का अनुभव नहीं है। Chrome और अधिक मानक अनुरूप ब्राउज़र नई सामग्री सुरक्षा नीति (CSP) मॉडल का पालन करते हैं।
पीटर पी।

4

MDN विनिर्देशों के अनुसार ,X-Frame-Options: ALLOW-FROM क्रोम में समर्थित नहीं है और एज और ओपेरा में समर्थन अज्ञात है।

Content-Security-Policy: frame-ancestorsओवरराइड्स X-Frame-Options( इस W3 कल्पना के अनुसार ), लेकिन frame-ancestorsसीमित संगतता है। इन MDN स्पेक्स के अनुसार , यह IE या एज में समर्थित नहीं है।


1

HTTP हैडर फील्ड X- फ्रेम-ऑप्शंस के लिए RFC बताता है कि एक्स-फ्रेम-ऑप्शंस हेडर वैल्यू में "ALLOW-FROM" फील्ड में केवल एक ही डोमेन हो सकता है। एकाधिक डोमेन की अनुमति नहीं है।

RFC इस समस्या के लिए काम करने का सुझाव देती है। समाधान डोमेन नाम को iframe src url में url पैरामीटर के रूप में निर्दिष्ट करना है। सर्वर जो iframe src url को होस्ट करता है, तो वह url पैरामीटर में दिए गए डोमेन नाम की जांच कर सकता है। यदि डोमेन नाम वैध डोमेन नामों की सूची से मेल खाता है, तो सर्वर एक्स-फ्रेम-ऑप्शन हेडर को मूल्य के साथ भेज सकता है: "ALLOW-FROM डोमेन-नाम", जहां डोमेन नाम उस डोमेन का नाम है जो करने की कोशिश कर रहा है दूरस्थ सामग्री एम्बेड करें। यदि डोमेन नाम नहीं दिया गया है या मान्य नहीं है, तो एक्स-फ्रेम-ऑप्शन हेडर को मूल्य के साथ भेजा जा सकता है: "इनकार"।


1

कड़ाई से नहीं, आप नहीं बोल सकते।

आप हालांकि निर्दिष्ट कर सकते हैं X-Frame-Options: mysite.comऔर इसलिए अनुमति देते हैं subdomain1.mysite.comऔर subdomain2.mysite.com। लेकिन हाँ, यह अभी भी एक डोमेन है। इसके लिए कुछ वर्कअराउंड होना चाहिए, लेकिन मुझे लगता है कि RFC स्पेक्स पर सीधे पढ़ना आसान है: https://tools.ietf.org/html/rfc7034

यह इंगित करने के लायक भी है कि सामग्री-सुरक्षा-नीति (CSP) हैडर के frame-ancestorनिर्देशों का एक्स-फ्रेम-ऑप्शन है। यहां अधिक पढ़ें


0

बिल्कुल समान नहीं है, लेकिन कुछ मामलों के लिए काम कर सकता है: एक और विकल्प है ALLOWALLजो प्रतिबंध को प्रभावी ढंग से हटा देगा, जो परीक्षण / पूर्व-उत्पादन वातावरण के लिए एक अच्छी बात हो सकती है


यह MDN पर प्रलेखित नहीं है।
औरग

0

मुझे IE और सामग्री-सुरक्षा-नीति के लिए अन्य ब्राउज़रों के लिए एक्स-फ़्रेम-विकल्प जोड़ना पड़ा। इसलिए मैंने निम्नलिखित कुछ किया।

if allowed_domains.present?
  request_host = URI.parse(request.referer)
  _domain = allowed_domains.split(" ").include?(request_host.host) ? "#{request_host.scheme}://#{request_host.host}" : app_host
  response.headers['Content-Security-Policy'] = "frame-ancestors #{_domain}"
  response.headers['X-Frame-Options'] = "ALLOW-FROM #{_domain}"
else
  response.headers.except! 'X-Frame-Options'
end

-4

एक संभावित समाधान एक "फ्रेम-ब्रेकर" स्क्रिप्ट का उपयोग किया जाएगा जैसा कि यहां वर्णित है

आपको केवल अपने अनुमत डोमेन के लिए जाँच करने के लिए "यदि" कथन को बदलना होगा।

   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       //your domain check goes here
       if(top.location.host != "allowed.domain1.com" && top.location.host == "allowed.domain2.com")
         top.location = self.location;
   }

मुझे लगता है कि यह समाधान सुरक्षित होगा। जावास्क्रिप्ट के साथ सक्षम नहीं होने के कारण आपको अपने पृष्ठ को दुर्भावनापूर्ण वेबसाइट के बारे में कोई सुरक्षा चिंता नहीं होगी।


1
यह एक ही मूल नीति के कारण काम नहीं करेगा जब top.location को कॉल किया जाएगा।
एरिक आर।

-8

हाँ। इस विधि ने कई डोमेन की अनुमति दी।

VB.NET

response.headers.add("X-Frame-Options", "ALLOW-FROM " & request.urlreferer.tostring())

9
यह एक्स-फ्रेम-ऑप्शंस के उद्देश्य को हराने के लिए लगता है क्योंकि यह किसी भी साइट को फ्रेम करने की अनुमति देता है।
एंड्री शेकिन

5
यह उत्तर ऐसा लगता है कि यह एक समाधान के रूप में एक अच्छा आधार हो सकता है, लेकिन इसे अतिरिक्त तर्क की आवश्यकता है ताकि यह केवल इस कोड को निष्पादित करे अगर request.urlreferer.tostring () उन मूल में से एक है जिसे आप अनुमति देना चाहते हैं।
ज़र्लबर्ग

यदि आप ऐसा कर रहे हैं, तो आप एक्स-फ्रेम-ऑप्शंस हेडर का उपयोग क्यों कर रहे हैं ... बस इसे अनदेखा करें
vs4vijay
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.