php - एक्सेस-कंट्रोल-ऑब्जेक्ट-उत्पत्ति को कैसे बाईपास करें?




javascript jquery (5)

इसे retrieve.php के शीर्ष पर रखें

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

यह ध्यान रखना महत्वपूर्ण है कि किसी भी वास्तविक आउटपुट को भेजने से पहले header() को कॉल किया जाना चाहिए।

गलत

<html>
<?php
header('Access-Control-Allow-Origin: *'); 
?>

सही बात

<?php
header('Access-Control-Allow-Origin: *'); 
?>
<html>

मैं अपने स्वयं के सर्वर पर एक मंच पर एक AJAX कॉल कर रहा हूं, जिसे उन्होंने इन AJAX कॉल को रोक दिया है (लेकिन मुझे अपने सर्वर के डेटा से पुनर्प्राप्त डेटा को प्रदर्शित करने के लिए अपने सर्वर से डेटा लाने की आवश्यकता है)। मेरी AJAX स्क्रिप्ट काम कर रही है, यह डेटा को संसाधित करने की अनुमति देने के लिए मेरे सर्वर की PHP स्क्रिप्ट पर भेज सकता है। हालांकि यह संसाधित डेटा वापस नहीं प्राप्त कर सकता है क्योंकि इसे "Access-Control-Allow-Origin" द्वारा अवरोधित किया गया है

मेरे पास उस प्लेटफॉर्म के स्रोत / कोर तक कोई पहुंच नहीं है। इसलिए मैं उस स्क्रिप्ट को नहीं हटा सकता जो मुझे ऐसा करने की अनुमति नहीं देता है। (पी / एसआई ने Google क्रोम कंसोल का इस्तेमाल किया और यह त्रुटि पाया)

नीचे दिखाए गए अजाक्स कोड:

 $.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);

      } 
  });

या ऊपर AJAX स्क्रिप्ट के लिए एक JSON समकक्ष कोड है? मुझे लगता है कि JSON की अनुमति है।

मुझे उम्मीद है कि कोई मेरी मदद कर सकता है।


एमवीसी 3 कंट्रोलर को कॉल करते समय मैंने इस समस्या को ठीक कर दिया है। मैंने कहा:

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

मेरे सामने

return Json(model, JsonRequestBehavior.AllowGet);

और मेरा $.ajax शिकायत कर रहा था कि यह मेरे AJAX कॉल में सामग्री-प्रकार शीर्षलेख स्वीकार नहीं करता है, इसलिए मैंने इसे टिप्पणी की क्योंकि मुझे पता है कि इसका JSON कार्रवाई में पारित हो रहा है।

उम्मीद है की वो मदद करदे।


ठीक है, लेकिन आप सभी जानते हैं कि * एक वाइल्डकार्ड है और हर डोमेन से क्रॉस साइट स्क्रिप्टिंग की अनुमति देता है?

अपने स्वयं के, विश्वसनीय डोमेन (और प्रोटोकॉल) के साथ सूची में क्यों न डालें;

 header('Access-Control-Allow-Origin: http://mysite1.com', false);
 header('Access-Control-Allow-Origin: http://example.com', false);
 header('Access-Control-Allow-Origin: https://www.mysite2.com', false);
 header('Access-Control-Allow-Origin: http://www.mysite2.com', false);

बहुत सुरक्षित है। (दूसरा पैरामीटर "झूठा" header() फ़ंक्शन को पुराने को ओवरराइट करने के लिए नहीं बताता है)

यह सुरक्षित क्यों है?

अन्य स्थानों से पहुंच की अनुमति देने के बाद आपकी अपनी भरोसेमंद साइट सत्र हाईजैकिंग की अनुमति देती है। मैं एक छोटे से उदाहरण के साथ जा रहा हूं - छवि फेसबुक एक वाइल्डकार्ड उत्पत्ति की अनुमति देता है - इसका मतलब है कि आप अपनी वेबसाइट कहीं और बना सकते हैं, और इसे फेसबुक पर AJAX कॉल (या खुले iframes) को आग लगाना है। इसका मतलब है कि आप अपनी वेबसाइट के आगंतुक के फेसबुक की लॉग इन जानकारी प्राप्त कर सकते हैं। इससे भी बदतर - आप POST अनुरोधों को स्क्रिप्ट कर सकते हैं और किसी के फेसबुक पर डेटा पोस्ट कर सकते हैं - बस जब वे आपकी वेबसाइट ब्राउज़ कर रहे हों।

ACAO हेडर का उपयोग करते समय बहुत सावधान रहें!


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

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();

तुम्हें नया तरीका मिल गया है।


चेतावनी , क्रोम (और अन्य ब्राउज़र्स) शिकायत करेंगे कि यदि आप कुछ अन्य उत्तरों का पालन करते हैं तो एकाधिक एसीएओ शीर्षलेख सेट किए जाते हैं।

त्रुटि कुछ ऐसा होगा जैसे XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access. 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");
}





json