অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-উত্সকে কীভাবে বাইপাস করবেন?


196

আমি একটি প্ল্যাটফর্মে আমার নিজের সার্ভারে একটি অজ্যাক্স কল করছি যা তারা এই এজাক্স কলগুলি প্রতিরোধ করে সেট করেছে (তবে আমার সার্ভারের ডাটাবেস থেকে পুনরুদ্ধারকৃত ডেটা প্রদর্শন করতে আমার সার্ভার থেকে ডেটা আনার দরকার আছে)। আমার এজাক্স স্ক্রিপ্টটি কাজ করছে, এটি প্রক্রিয়া করার অনুমতি দেওয়ার জন্য এটি আমার সার্ভারের পিএইচপি স্ক্রিপ্টে ডেটা প্রেরণ করতে পারে। তবে এটি প্রক্রিয়াজাত ডেটা দ্বারা আটকে থাকায় এটি আর ফিরে পেতে পারে না"Access-Control-Allow-Origin"

প্ল্যাটফর্মের উত্স / কোরটিতে আমার কোনও অ্যাক্সেস নেই। সুতরাং আমি স্ক্রিপ্টটি সরাতে পারছি না যা এটি আমাকে করা থেকে বারণ করে। (পি / এসআই গুগল ক্রোমের কনসোল ব্যবহার করেছে এবং এই ত্রুটিটি খুঁজে পেয়েছে)

নীচে প্রদর্শিত অ্যাজাক্স কোড:

 $.ajax({
     type: "GET",
     url: "http://example.com/retrieve.php",
     data: "id=" + id + "&url=" + url,
     dataType: 'json',   
     cache: false,
     success: function(data)
      {
        var friend = data[1];              
        var blog = data[2];           
        $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog);

      } 
  });

বা JSONউপরের এজাক্স স্ক্রিপ্টের সমতুল্য কোড রয়েছে? আমি মনে করি JSONঅনুমোদিত।

আমি আশা করি কেউ আমাকে সাহায্য করতে পারে।


আপনার প্রশ্নের সমস্ত উত্তর এখনও পর্যন্ত আপনার সার্ভার কোডটি পুনরায় লেখার একটি উপায় ব্যাখ্যা করেছে যাতে আপনি আজাক্স কাজ করবে। এগুলির মধ্যে কোনওটিই বাইপাসিং সম্পর্কে নয়, যেমন আপনি আপনার প্রশ্নে বিশেষভাবে জিজ্ঞাসা করেছিলেন। আপনি কি এই শিরোলেখিকে বাইপাস করতে আসলেই খুঁজে পেয়েছেন? আমি সত্যিই সন্দেহ যে সেখানে একটি হবে।
মোরাদনেজাদ

এটিকে বাইপাস করার কোনও উপায় নেই। তবে আপনি আপনার ব্যাকএন্ডে একটি ফাইল রাখতে পারেন যা অনুরোধটি সম্পাদন করে। সুতরাং আপনি নিজের সার্ভারে অ্যাজ্যাক্সের জন্য ফাইলটি কল করেন, এই ফাইলটি retrieve.php থেকে ডেটা লোড করে এবং আপনার জাভাস্ক্রিপ্টে ফিরে পাঠায়। সেক্ষেত্রে কোনও সিওআরএস বিধি আপনাকে অবরুদ্ধ করে না।
জোনা পলাস

উত্তর:


365

এটিকে retrieve.php এর উপরে রাখুন:

header('Access-Control-Allow-Origin: *');  

নোট করুন যে এটি কার্যকরভাবে CORS সুরক্ষা অক্ষম করে এবং আপনার ব্যবহারকারীদের আক্রমণ করার জন্য উন্মুক্ত করে। যদি আপনি সম্পূর্ণরূপে নিশ্চিত না হন যে আপনাকে সমস্ত উত্সের অনুমতি দেওয়া দরকার তবে আপনার এটিকে আরও নির্দিষ্ট উত্সে লক করা উচিত:

header('Access-Control-Allow-Origin: https://www.example.com')

আরও ভাল বোঝার জন্য দয়া করে নিম্নলিখিত স্ট্যাক উত্তরটি দেখুন Access-Control-Allow-Origin

https://stackoverflow.com/a/10636765/413670


54
বরং অনিরাপদ। নীচে আমার উত্তর দেখুন।
রব

3
tnx, তবে আপনার নিজের মন্তব্যে @ রোবকিউজিস্ট দ্বারা বর্ণিত সমস্ত উত্সের অ্যাক্সেসের অনুমতি দেওয়া উচিত নয় এবং তার উত্তরে আরও ভাল পদ্ধতির ব্যবস্থা করা হয়েছে
রাফায়

2
সুতরাং আমি এই পৃষ্ঠাটি পেয়েছি কারণ আমার একটি সার্ভারে অ্যাক্সেস নিয়ন্ত্রণ 'বাইপাস' করতে হয়েছিল। এখানে সমাধানটি কোনও কিছুকে বাইপাস না করে কেবল নিজের সার্ভারে অ্যাক্সেস নিয়ন্ত্রণকে সঠিকভাবে কনফিগার করে। যদি কারও বাইরে আসার দরকার হয় তবে তারা পিএইচপি'র ফাইল_জেট_কন্টেন্টস ($ রিমোট_আরল) ব্যবহার করতে পারে। এটি করার জন্য অবশ্যই অনেকগুলি উপায় রয়েছে তবে আমি এটি এটি করেছিলাম did
শন হুইনারি

1
@ শ্যাশনহিনারি মূলত "প্রক্সিং" এর কাজ। ভাল সমাধান যদি আপনি সত্যিই অন্য ওয়েবসাইট থেকে ডেটা লোড করতে চান তবে আপনার নিয়ন্ত্রণ নেই।
রব

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

290

ঠিক আছে, তবে আপনি সকলেই জানেন যে * একটি ওয়াইল্ডকার্ড এবং প্রতিটি ডোমেন থেকে ক্রস সাইট স্ক্রিপ্টিংয়ের অনুমতি দেয়?

আপনি Access-Control-Allow-Originমঞ্জুরিপ্রাপ্ত প্রতিটি সাইটের জন্য একাধিক শিরোনাম প্রেরণ করতে চান - তবে দুর্ভাগ্যক্রমে এটি আনুষ্ঠানিকভাবে একাধিক Access-Control-Allow-Originশিরোনাম প্রেরণ বা একাধিক উত্স তৈরিতে সমর্থিত নয় ।

আপনি যদি এটির অনুমতি পেয়ে থাকেন তবে এটির মূলটি পরীক্ষা করে এবং শিরোনামে এটি ফেরত পাঠিয়ে সমাধান করতে পারেন:

$origin = $_SERVER['HTTP_ORIGIN'];
$allowed_domains = [
    'http://mysite1.com',
    'https://www.mysite2.com',
    'http://www.mysite2.com',
];

if (in_array($origin, $allowed_domains)) {
    header('Access-Control-Allow-Origin: ' . $origin);
}

এটি অনেক বেশি নিরাপদ। আপনি ম্যাচটি সম্পাদনা করতে এবং এটি কোনও রেইগেক্স, বা এর মতো কিছু দিয়ে ম্যানুয়াল ফাংশনে পরিবর্তন করতে চাইতে পারেন। কমপক্ষে এটি কেবলমাত্র 1 টি শিরোলেখী প্রেরণ করবে এবং আপনি নিশ্চিত হয়ে উঠবেন যে অনুরোধটি এসেছে তারই এটি। দয়া করে নোট করুন যে সমস্ত HTTP শিরোনাম পারে প্রতারণামূলক, কিন্তু এই হেডার ক্লায়েন্টের সুরক্ষার জন্য হয়। এই মানগুলির সাথে আপনার নিজের ডেটা রক্ষা করবেন না। আপনি যদি আরও জানতে চান তবে সিওআরএস এবং সিএসআরএফটি সম্পর্কে কিছুটা পড়ুন।

এটি নিরাপদ কেন?

অন্য অবস্থান থেকে অ্যাক্সেসের অনুমতি দিলে আপনার নিজের বিশ্বস্ত সাইটটি সেশন হাইজ্যাকিংয়ের অনুমতি দেয়। আমি একটি সামান্য উদাহরণ দিয়ে যেতে যাচ্ছি - চিত্র ফেসবুক একটি ওয়াইল্ডকার্ড উত্সকে অনুমতি দেয় - এর অর্থ হল আপনি নিজের ওয়েবসাইটটি কোথাও তৈরি করতে পারেন এবং ফেসবুকে এজেএক্স কলগুলি (বা iframes খুলুন) ফায়ার করতে পারেন। এর অর্থ আপনি আপনার ওয়েবসাইটের দর্শকের ফেসবুকের লগ ইন করা তথ্য দখল করতে পারেন। আরও খারাপ - আপনি স্ক্রিপ্ট করতে পারেনPOST অনুরোধ এবং কারও ফেসবুকে ডেটা পোস্ট - যখন তারা আপনার ওয়েবসাইটটি ব্রাউজ করছেন।

ACAOহেডার ব্যবহার করার সময় খুব সতর্ক থাকুন !


12
আমি মনে করি আপনাকে তালিকার প্রতিটি আইটেমের সামনে http: // দেওয়া দরকার। কমপক্ষে আমি যে একটি সাইটে কাজ করছি তার জন্য আমি করেছি।
blak3r

2
দুঃখের বিষয়, এটি কাজ করে না বলে মনে হচ্ছে। আমি বিশ্বাস করি যে হেডারে প্রতি কল প্রতি একমাত্র ব্যতিক্রম সরবরাহ করা যেতে পারে ()।
লুভিড

5
@ শনিমাল ও লুসিড -> আমার ধারণা অনুমান কমা বিচ্ছিন্নভাবে কাজ করবে না। তথ্যসূত্র: w3.org/TR/cors
রব

3
: একটি ডোমেন এর এখানে একটি প্রাসঙ্গিক উত্তর তালিকা মোকাবেলার জন্য stackoverflow.com/a/1850482/766177
ভ্যালেন্টিন Despa

13
এটি অর্থহীন 4 টি শিরোনাম যুক্ত করে কারণ প্রতিটি কল header()একই ধরণের পূর্ববর্তী শিরোনামকে প্রতিস্থাপন করে। সুতরাং সত্যিই আপনি যা করছেন তা হ'ল শেষ শিরোনামটি সেট করে। ম্যানুয়ালি প্রবেশ করানোর যুক্তরাষ্ট্রের আপনি একটি দ্বিতীয় প্যারামিটারটি সেট করতে পারেন যে falseপূর্ববর্তী হেডার মুছে ফেলা প্রতিরোধ।
ব্যাডহর্সি

31

সতর্কতা , ক্রোম (এবং অন্যান্য ব্রাউজারগুলি) অভিযোগ করবে যে আপনি যদি অন্য কয়েকটি উত্তর অনুসরণ করেন তবে একাধিক ACAO শিরোনাম সেট করা আছে।

ত্রুটি এমন কিছু হবে XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.

এটা চেষ্টা কর:

$http_origin = $_SERVER['HTTP_ORIGIN'];

$allowed_domains = array(
  'http://domain1.com',
  'http://domain2.com',
);

if (in_array($http_origin, $allowed_domains))
{  
    header("Access-Control-Allow-Origin: $http_origin");
}

6
এটি আমি পোস্ট করা একটি আরও ভাল সমাধান।
রব

7

এমভিসি 3 কন্ট্রোলারকে কল করার সময় আমি এই সমস্যাটি সমাধান করেছি। আমি যোগ করলাম:

Response.AddHeader("Access-Control-Allow-Origin", "*"); 

আমার আগে

return Json(model, JsonRequestBehavior.AllowGet);

এবং আমারও $.ajaxঅভিযোগ ছিল যে এটি আমার এজ্যাক্স কন্টেন্ট-টাইপ শিরোনাম গ্রহণ করে না , তাই আমি জেএসএনকে অ্যাকশনে পাঠানো হচ্ছে বলে আমি মন্তব্য করেছি out

আশা করি এইটি কাজ করবে.


2

এটি ব্যবহার করা সত্যিই খারাপ ধারণা *, যা আপনাকে সাইট স্ক্রিপ্টিংয়ের জন্য ক্রস করতে পুরোপুরি উন্মুক্ত করে দেয়। আপনি মূলত আপনার নিজের এসএসএল সেটিংসে স্কোপ করা এবং opচ্ছিকভাবে অতিরিক্ত ডোমেনগুলি আপনার নিজের ডোমেনের সমস্ত সময় চান। আপনি তাদের সকলকে একটি শিরোনাম হিসাবে প্রেরণ করতে চান। নিম্নলিখিতটি সর্বদা আপনার নিজের ডোমেনকে বর্তমান পৃষ্ঠার মতো একই এসএসএল স্কোপে অনুমোদন দেবে এবং allyচ্ছিকভাবে অতিরিক্ত কয়েকটি ডোমেনও অন্তর্ভুক্ত করতে পারে। এটি সমস্তকে একটি শিরোনাম হিসাবে প্রেরণ করবে এবং একাধিক অ্যাক্সেস নিয়ন্ত্রণের হেডার প্রেরণের বিষয়ে ব্রাউজারের কোনও সম্ভাবনা এড়াতে অন্য কিছু ইতিমধ্যে তাদের প্রেরণ করা থাকলে পূর্ববর্তীগুলিকে ওভাররাইট করে।

class CorsAccessControl
{
    private $allowed = array();

    /**
     * Always adds your own domain with the current ssl settings.
     */
    public function __construct()
    {
        // Add your own domain, with respect to the current SSL settings.
        $this->allowed[] = 'http'
            . ( ( array_key_exists( 'HTTPS', $_SERVER )
                && $_SERVER['HTTPS'] 
                && strtolower( $_SERVER['HTTPS'] ) !== 'off' ) 
                    ? 's' 
                    : null )
            . '://' . $_SERVER['HTTP_HOST'];
    }

    /**
     * Optionally add additional domains. Each is only added one time.
     */
    public function add($domain)
    {
        if ( !in_array( $domain, $this->allowed )
        {
            $this->allowed[] = $domain;
        }
    /**
     * Send 'em all as one header so no browsers grumble about it.
     */
    public function send()
    {
        $domains = implode( ', ', $this->allowed );
        header( 'Access-Control-Allow-Origin: ' . $domains, true ); // We want to send them all as one shot, so replace should be true here.
    }
}

ব্যবহার:

$cors = new CorsAccessControl();

// If you are only authorizing your own domain:
$cors->send();

// If you are authorizing multiple domains:
foreach ($domains as $domain)
{
    $cors->add($domain);
}
$cors->send();

আপনি ধারণা পেতে।


1

আপনি কি আপনার সার্ভার থেকে প্রেরিত প্রতিক্রিয়ায় অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি-অরিজিনের শিরোনামটি যুক্ত করার চেষ্টা করেছেন? লাইক Access-Control-Allow-Origin: *,?


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