এক্স-ফ্রেম-বিকল্পগুলি একাধিক ডোমেন থেকে অনুমতি দিন


100

আমার একটি এএসপি.নেট 4.0 আইআইএস 7.5 সাইট রয়েছে যা এক্স-ফ্রেম-অপশন শিরোনামটি ব্যবহার করে আমার সুরক্ষিত দরকার।

আমার সাইটের পৃষ্ঠাগুলি আমার একই ডোমেনের পাশাপাশি আমার ফেসবুক অ্যাপ্লিকেশন থেকে iframed করতে সক্ষম করা প্রয়োজন to

বর্তমানে আমি আমার সাইটটি এর প্রধান সাইটটির সাথে কনফিগার করেছি:

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

আমি যখন আমার ফেসবুক পৃষ্ঠাটি ক্রোম বা ফায়ারফক্সের সাথে দেখি আমার সাইট পৃষ্ঠা (আমার ফেসবুক পৃষ্ঠাটি দ্বারা ইমফ্রেড করা হচ্ছে) ঠিক আছে তবে আইই 9 এর অধীনে আমি ত্রুটি পেয়েছি:

"এই পৃষ্ঠাটি প্রদর্শিত হতে পারে না ..." ( X-Frame_Optionsসীমাবদ্ধতার কারণে )।

আমি কীভাবে X-Frame-Options: ALLOW-FROMএকটি একক ডোমেনের চেয়ে বেশি সমর্থন করতে সেট করব ?

X-FRAME-OPTION একটি নতুন বৈশিষ্ট্য হ'ল মৌলিকভাবে ত্রুটিযুক্ত মনে হয় যদি কেবলমাত্র একটি ডোমেন সংজ্ঞায়িত করা যায়।


4
এটি একটি পরিচিত সীমাবদ্ধতা বলে মনে হচ্ছে: owasp.org/index.php/…
পিয়েরে আর্নস্ট

উত্তর:


111

X-Frame-Optionsঅবচয় করা হয়। এমডিএন থেকে :

এই বৈশিষ্ট্যটি ওয়েব মান থেকে সরানো হয়েছে। যদিও কিছু ব্রাউজার এখনও এটি সমর্থন করতে পারে তবে এটি বাদ দেওয়ার প্রক্রিয়াধীন। পুরানো বা নতুন প্রকল্পে এটি ব্যবহার করবেন না। এটি ব্যবহার করে পৃষ্ঠা বা ওয়েব অ্যাপ্লিকেশনগুলি যে কোনও সময় ভেঙে যেতে পারে।

আধুনিক বিকল্প হ'ল Content-Security-Policyশিরোনাম, যা অন্যান্য অনেক নীতিমালা বরাবর frame-ancestorsনির্দেশাবলী ব্যবহার করে কোনও ইউআরএলকে কোনও ফ্রেমে হোস্ট করার অনুমতি দেয় কি না তা সাদা তালিকাভুক্ত করতে পারে ।
frame-ancestorsএকাধিক ডোমেন এবং এমনকি ওয়াইল্ডকার্ড সমর্থন করে, উদাহরণস্বরূপ:

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

দুর্ভাগ্যক্রমে, আপাতত, ইন্টারনেট এক্সপ্লোরার সামগ্রী-সুরক্ষা-নীতিটিকে পুরোপুরি সমর্থন করে না

আপডেট: এমডিএন তাদের হ্রাসের মন্তব্যটি সরিয়ে দিয়েছে। এখানে ডাব্লু 3 সি এর সামগ্রী সুরক্ষা নীতি স্তর থেকে অনুরূপ মন্তব্য দেওয়া হয়েছে

frame-ancestorsনির্দেশ obsoletesX-Frame-Options হেডার। যদি কোনও সংস্থার উভয় নীতিই থাকে তবে frame-ancestorsনীতিটি প্রয়োগ করা উচিত এবং X-Frame-Optionsনীতি উপেক্ষা করা উচিত।


14
ফ্রেম-পূর্বপুরুষদের এমডিএনতে "পরীক্ষামূলক এপিআই হিসাবে চিহ্নিত করা হয় এবং উত্পাদন কোডে ব্যবহার করা উচিত নয়"। + এক্স-ফ্রেম-বিকল্পগুলি অবচিত নয় বরং "অ-মানক" তবে "বহুল সমর্থনযোগ্য এবং সিএসপির সাথে একত্রে ব্যবহার করা যেতে পারে"
জোনাথন মুলার

4
@ জোনাথন মুলার - শব্দটি X-Frame-Optionsপরিবর্তিত হয়েছে, এখন কম তীব্র is এটি একটি ভাল বিষয় যে চূড়ান্ত নয় এমন একটি অনুমান ব্যবহার করা ঝুঁকিপূর্ণ। ধন্যবাদ!
কোবি

4
আমি আর এমডিএন-তে ত্রুটিযুক্ত সতর্কতা আর খুঁজে পাচ্ছি না। মোজিলা কি তাদের মতামত পরিবর্তন করেছে?
থোমসকনরাদ 3

4
@ to0om - ধন্যবাদ! আমি উত্তরটি আরও একটি মন্তব্য দিয়ে আপডেট করেছি। আমি আমার উত্তরে খুব শক্ত হয়ে এসেছি। যে কোনও উপায়ে, X-Frame-Optionsএকাধিক উত্সকে সমর্থন করে না।
কোবি

4
@ কোবি, আমি মনে করি উত্তরটির পুনরায় সংগঠিত হওয়া দরকার। প্রথম বাক্যে বলা হয়েছে যে এটি এমডিএন অনুসারে অবনতিযুক্ত। আপনি শীর্ষে নিজের আপডেট যুক্ত করলে (কম গা .় রঙিন "UPDATE:" দিয়ে) এটি কম বিভ্রান্তিকর হবে। ধন্যবাদ
কাসুন গাজাসেহে

39

আরএফসি 7034 থেকে :

সব থেকে এক বিবৃতিতে একাধিক ডোমেন ঘোষণা করার জন্য ওয়াইল্ডকার্ডস বা তালিকার অনুমতি নেই

সুতরাং,

আমি এক্স-ফ্রেম-বিকল্পগুলি কীভাবে সেট করব: একক ডোমেনের চেয়ে আরও বেশি সমর্থন করার জন্য Allow-FROM?

আপনি পারবেন না। কাজের ভিত্তিতে আপনি বিভিন্ন অংশীদারের জন্য বিভিন্ন ইউআরএল ব্যবহার করতে পারেন। প্রতিটি ইউআরএল এর জন্য আপনি এর নিজস্ব 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

বিটিডাব্লু , আপাতত ক্রোম (এবং সমস্ত ওয়েবকিট-ভিত্তিক ব্রাউজারগুলি) মোটেই ALLOW-FROM বিবৃতি সমর্থন করে না


4
দেখে মনে হচ্ছে যে ওয়েবকিট এখন ALLOW-FROMআপনার সরবরাহিত লিঙ্কটি ব্যবহার করে সমর্থন করে।
জিমি

4
@ জিমি না তা নয় - প্রশ্নের লিঙ্কে শেষ মন্তব্যটি বলেছে যে পরিবর্তে আপনাকে সিএসপি নীতি ব্যবহার করা দরকার। এই বিকল্পটি এখনও ক্রোমে কাজ করে না।
নিক

9

Necromancing।
প্রদত্ত উত্তরগুলি অসম্পূর্ণ।

প্রথমে যেমন আগেই বলা হয়েছে, আপনি একাধিক অনুমতি হোস্ট যোগ করতে পারবেন না, এটি সমর্থিত নয়।
দ্বিতীয়ত, আপনাকে এইচটিটিপি রেফারারের কাছ থেকে গৌণিকভাবে সেই মানটি বের করতে হবে, যার অর্থ আপনি ওয়েবকনফিগে মানটি যুক্ত করতে পারবেন না কারণ এটি সর্বদা একই মান হয় না।

ব্রাউজারটি যখন 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 

আপনাকে এইচটিটিপি-মডিউল ইন্স ফাংশনে কনটেক্সট_এন্ডআরউয়েস্ট ফাংশনটি নিবন্ধিত করতে হবে।

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


}

এর পরে আপনাকে আপনার অ্যাপ্লিকেশনটিতে মডিউল যুক্ত করতে হবে। আপনি এই জাতীয়ভাবে HTTP অ্যাপ্লিকেশনটির আরম্ভ ফাংশনটিকে ওভাররাইড করে গ্লোবাল.অ্যাসাক্সে এই প্রোগ্রামটিমেটি করতে পারেন:

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)
        {

        }


    }


}

অথবা আপনি যদি অ্যাপ্লিকেশন উত্স-কোডের মালিক না হন তবে আপনি ওয়েবকনফিগটিতে এন্ট্রি যুক্ত করতে পারেন:

      <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 এ এন্ট্রি আইআইএস ++ এর জন্য, অন্যটি সিস্টেম.ওয়েব আইআইএস for এর জন্য
Note নোট করুন যে আপনাকে রানআলম্যানেজডমডিউলসঅলআরকেষ্টগুলি সত্য হিসাবে সেট করা দরকার, এর জন্য এটি সঠিকভাবে কাজ করে।

স্ট্রিং টাইপ ফর্ম্যাট হয় "Namespace.Class, Assembly"। মনে রাখবেন যে আপনি যদি সি # এর পরিবর্তে ভিবি.এনইটি তে আপনার অ্যাসেম্বলি লিখে থাকেন তবে ভিবি প্রতিটি প্রকল্পের জন্য একটি ডিফল্ট-নেমস্পেস তৈরি করে, তাই আপনার স্ট্রিংটি দেখতে হবে

"[DefaultNameSpace.Namespace].Class, Assembly"

আপনি যদি এই সমস্যাটি এড়াতে চান তবে সি # তে ডিএলএল লিখুন।


আমি মনে করি আপনি উত্তর থেকে 'vmswiss Life' এবং 'vmraiffeisen' সরাতে চাইবেন যাতে এটি মিথ্যা সম্পর্ক খুঁজে না পায়।
কোয়েটজলকোটল

@ কোয়েটজলকোটল: আমি তাদের উদাহরণ হিসাবে সেখানে রেখেছি, এটি কোনও তদারকি নয়, এটি কোনওভাবেই গোপনীয় নয়। তবে সত্য, এগুলি আরও ভাল করে ফেলতে পারে। সম্পন্ন.
স্টিফান স্টেইগার

7

এমন পদ্ধতির সম্পর্কে কীভাবে যা কেবলমাত্র একাধিক ডোমেনকেই মঞ্জুরি দেয় না, তবে গতিশীল ডোমেনগুলিকেও অনুমতি দেয়।

এখানে ব্যবহারের কেসটি একটি শেয়ারপয়েন্ট অ্যাপ অংশের সাথে রয়েছে যা আমাদের সাইটের শেয়ারপয়েন্টের ভিতরে একটি iframe মাধ্যমে লোড করে। সমস্যাটি হ'ল শেয়ারপয়েন্টে https://yoursite.sharePoint.com এর মতো গতিশীল সাবডোমেন রয়েছে । আই আই এর জন্য, আমাদের সব থেকে https: //.sharePoint.com নির্দিষ্ট করতে হবে

কৌতুকপূর্ণ ব্যবসা, তবে আমরা দুটি তথ্য জেনে এটি সম্পন্ন করতে পারি:

  1. যখন কোনও আইফ্রেম লোড হয়, এটি কেবলমাত্র প্রথম অনুরোধে এক্স-ফ্রেম-বিকল্পগুলিকে বৈধতা দেয়। একবার 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

এখানে আমরা অভিভাবক ডোমেনের উপর ভিত্তি করে গতিশীলভাবে ডোমেনগুলিকে অনুমতি দিতে পারি। এই ক্ষেত্রে, আমরা নিশ্চিত করি যে হোস্টটি আমাদের সাইটকে ক্লিক জ্যাকিং থেকে সুরক্ষিত করে শেয়ারপয়েন্ট.কম এ শেষ হবে।

আমি এই পদ্ধতির উপর প্রতিক্রিয়া শুনতে পছন্দ করি।


4
সতর্কতা: হোস্টটি "fkesharePoint.com" হলে এই ব্রেক হয়। /\.sharepoint\.com$/
রেজেক্সটি

@ স্টেফানস্টেইগার এটি ঠিক, তবে ক্রোমও এই সমস্যাটি অনুভব করে না। Chrome এবং আরও মান সম্মত ব্রাউজারগুলি নতুন সামগ্রী সুরক্ষা নীতি (সিএসপি) মডেল অনুসরণ করে।
পিটার পি।

4

অনুযায়ী MDN উল্লেখ ,X-Frame-Options: ALLOW-FROM Chrome এ সমর্থিত নয় এবং সমর্থন এজ এবং অপেরায় অজানা।

Content-Security-Policy: frame-ancestorsওভাররাইড X-Frame-Options( এই ডাব্লু 3 অনুষঙ্গ অনুযায়ী ), তবে frame-ancestorsসীমিত সামঞ্জস্য রয়েছে। এই এমডিএন স্পেস অনুসারে , এটি আইই বা এজতে সমর্থিত নয়।


1

এইচটিটিপি শিরোলেখ ক্ষেত্র এক্স-ফ্রেম-বিকল্পগুলির জন্য আরএফসি সূচিত করে যে এক্স-ফ্রেম-বিকল্পগুলির শিরোনাম মানের "ALLOW-FROM" ক্ষেত্রে কেবল একটি ডোমেন থাকতে পারে। একাধিক ডোমেন অনুমোদিত নয়।

আরএফসি এই সমস্যার জন্য একটি কাজ প্রস্তাব করে। সমাধানটি হ'ল iframe src url এ ইউআরএল প্যারামিটার হিসাবে ডোমেন নাম নির্দিষ্ট করা। যে সার্ভারটি iframe src ইউআরএল হোস্ট করে তা ইউআরএল প্যারামিটারে প্রদত্ত ডোমেন নামটি পরীক্ষা করতে পারে। যদি ডোমেন নামটি বৈধ ডোমেন নামের একটি তালিকার সাথে মেলে, তবে সার্ভারটি এক্স-ফ্রেম-বিকল্পের শিরোনামটি মান সহ পাঠাতে পারে: "সব থেকে ডোমেন-নাম", যেখানে ডোমেন নাম সেই ডোমেনের নাম যা চেষ্টা করছে দূরবর্তী সামগ্রী এম্বেড করুন। যদি ডোমেনের নাম দেওয়া না হয় বা বৈধ না হয়, তবে এক্স-ফ্রেম-অপশন শিরোনাম: "অস্বীকার করুন" মান সহ পাঠানো যেতে পারে।


1

কড়া কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কথায় কই না

আপনি তবে নির্দিষ্ট করতে পারেন X-Frame-Options: mysite.comএবং তাই অনুমতি দিন subdomain1.mysite.comএবং subdomain2.mysite.com। তবে হ্যাঁ, এটি এখনও একটি ডোমেন। এটির জন্য কিছুটা কার্যকর হতে পারে তবে আমি মনে করি এটি সরাসরি আরএফসি স্পেসে পড়া সবচেয়ে সহজ: https://tools.ietf.org/html/rfc7034

বিষয়বস্তু-সুরক্ষা-নীতি (সিএসপি) শিরোনামের frame-ancestorএক্স-ফ্রেম-বিকল্পগুলি অপ্রচলিত করে তোলে তাও উল্লেখযোগ্য । এখানে আরও পড়ুন


0

ঠিক একই নয়, তবে কিছু ক্ষেত্রে কাজ করতে পারে: আরও একটি বিকল্প রয়েছে ALLOWALLযা কার্যকরভাবে সীমাবদ্ধতাটি সরিয়ে ফেলবে, যা পরীক্ষার / প্রাক-উত্পাদন পরিবেশের জন্য খুব সুন্দর জিনিস হতে পারে


এটি এমডিএন-তে নথিভুক্ত নয়।
andig

0

আই-এর জন্য এক্স-ফ্রেম-বিকল্পগুলি এবং অন্যান্য ব্রাউজারগুলির জন্য সামগ্রী-সুরক্ষা-নীতি যুক্ত করতে হয়েছিল। সুতরাং আমি অনুসরণ মত কিছু করেছি।

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" বিবৃতি পরিবর্তন করতে হবে।

   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;
   }

এই কর্মক্ষেত্রটি নিরাপদ হবে বলে আমি মনে করি। কারণ জাভাস্ক্রিপ্ট সক্ষম না করে আপনার পৃষ্ঠা তৈরির কোনও দূষিত ওয়েবসাইট সম্পর্কে আপনার কোনও সুরক্ষা উদ্বেগ থাকবে না।


4
শীর্ষ.লোকশন কল করার সময় এটি একই উত্স নীতিের কারণে কাজ করবে না।
এরিক আর

-8

হ্যাঁ. এই পদ্ধতিতে একাধিক ডোমেন অনুমোদিত হয়েছে।

ভিবি.এনইটি

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

9
এটি এক্স-ফ্রেম-বিকল্পগুলির উদ্দেশ্যকে পরাভূত বলে মনে হচ্ছে কারণ এটি কোনও সাইটের ফ্রেম তৈরি করতে দেয়।
আন্দ্রে শেক্কিন

5
এই উত্তরটি মনে হচ্ছে এটি সমাধান হিসাবে একটি ভাল বেস হতে পারে তবে এটির জন্য অতিরিক্ত যুক্তি প্রয়োজন যাতে এটি কেবল এই কোডটি কার্যকর করে যদি অনুরোধ.urlreferer.tostring () আপনি অনুমতি দিতে চান যেগুলির মধ্যে একটি হল।
জার্গলেব

যদি আপনি এটি করছেন, আপনি কেন এক্স-ফ্রেম-বিকল্প শিরোনাম ব্যবহার করছেন ... কেবল এটিকে উপেক্ষা করুন
vs4vijay
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.