php - كيفية تجاوز Access-Control-Allow-Origin؟




javascript jquery (5)

أنا أقوم بإجراء مكالمة ajax إلى خادمي الخاص على النظام الأساسي الذي قاموا بمنعه من إجراء مكالمات Ajax هذه (لكنني أحتاج إلى إحضار البيانات من الخادم الخاص بي لعرض البيانات المستردة من قاعدة بيانات خادمي). يعمل برنامجي النصي ajax ، ويمكنه إرسال البيانات إلى برنامج PHP النصي لخادمي للسماح لها بمعالجة. ومع ذلك ، لا يمكن استعادة البيانات التي تمت معالجتها حيث يتم حظرها بواسطة "Access-Control-Allow-Origin"

ليس لدي إمكانية الوصول إلى مصدر / مركز النظام الأساسي هذا. لذلك لا يمكنني إزالة البرنامج النصي الذي يمنعني من القيام بذلك. (استخدمت P / SI وحدة تحكم Google Chrome واكتشفت هذا الخطأ)

رمز Ajax كما هو موضح أدناه:

 $.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 مكافئة لخط ajax أعلاه؟ أعتقد أن JSON مسموح به.

أتمنى أن يساعدني شخص ما.


انها فكرة سيئة حقا لاستخدام * ، مما يترك لك مفتوحة على مصراعيها عبر البرمجة النصية للموقع. أنت تريد أساسًا نطاقك الخاص في كل الأوقات ، وتحديد نطاقه إلى إعدادات SSL الحالية ، ونطاقات إضافية اختيارية. أنت أيضًا تريد إرسالها كلها كرأس واحد. سيسمح الإجراء التالي دائمًا بنطاقك بنفس نطاق طبقة المقابس الآمنة كما هو الحال في الصفحة الحالية ، كما يمكن اختياريًا أيضًا تضمين أي عدد من النطاقات الإضافية. ستقوم بإرسالها كلها كرأس واحد ، والكتابة فوق الحرف (الأرقام) السابقة إذا قام شخص آخر بالفعل بإرسالها لتجنب أي فرصة للمتصفح المتذمر حول رؤوس التحكم في الوصول المتعددة التي يتم إرسالها.

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

انت وجدت الفكرة.


حسنًا ، لكنك تعلم جميعًا أن الرمز * هو حرف بدل ويسمح بالبرمجة عبر الموقع من كل مجال؟

لماذا لا تضع في قائمة مع المجالات الخاصة بك والموثوق بها (والبروتوكولات) ؛

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

هذا أكثر أمنا. (المعلمة الثانية "false" تخبر الدالة header() بعدم الكتابة فوق الكتابة القديمة)

لماذا هو أكثر أمنا؟

السماح بالوصول من مواقع أخرى ، يتيح لك الموقع الموثوق به إمكانية رفع مستوى الجلسة. سوف أذهب مع مثال صغير - تسمح لك Facebook بأصل بدل - وهذا يعني أنه يمكنك إنشاء موقع الويب الخاص بك في مكان ما ، وجعله يطلق مكالمات AJAX (أو إطارات مفتوحة) إلى facebook. هذا يعني أنه يمكنك الحصول على معلومات تسجيل الدخول الخاصة بفيس بوك زائر لموقع الويب الخاص بك. والأسوأ من ذلك - يمكنك كتابة طلبات POST ونشر البيانات على فيس بوك لشخص ما - فقط أثناء تصفحك لموقعك.

كن حذرا جدا عند استخدام رؤوس ACAO !


ضعه على قمة استرجاع

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

من المهم ملاحظة أنه يجب استدعاء header() قبل إرسال أي إخراج فعلي.

خطأ

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

صيح

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

لقد أصلحت هذه المشكلة عند استدعاء وحدة تحكم MVC3. أضفت:

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

قبل

return Json(model, JsonRequestBehavior.AllowGet);

وأيضاً كان يشكو $.ajax من أنه لا يقبل رأس نوع المحتوى في مكالمة أجاكس الخاصة بي ، لذا علّقت به كما أعرف أن JSON الخاص به يتم تمريره إلى الإجراء.

امل ان يساعد.


تحذير ، كروم (والمتصفحات الأخرى) سوف يشكو من أن رؤوس ACAO متعددة يتم ضبطها إذا كنت تتبع بعض الإجابات الأخرى.

سيكون الخطأ شيء مثل 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