同源政策與跨域請求

it書童發表於2020-02-08

同源政策

1995年,同源政策由 Netscape(網景) 公司引入瀏覽器。目前,所有瀏覽器都實行這個政策。

最初,它的含義是指,A 網頁設定的 Cookie,B 網頁不能開啟,除非這兩個網頁同源。所謂同源指的是三個相同。

  • 協議相同(http https)

  • 域名相同

  • 埠相同(預設80埠)

隨著網際網路的發展,同源政策越來越嚴格,目前非同源的站點發出請求會受到以下限制

  • Cookie無法讀取。

  • DOM 無法獲得。

  • JAX 請求無效(可以傳送,但瀏覽器會拒絕接受響應)

跨域請求

違反了同源政策,就屬於跨域請求

新建 index.html

<script>
    var xhr = new XMLHttpRequest();
    xhr.open('get', 'http://local.b.com');
    res = xhr.send();
</script>

服務端的響應 index.php

echo "汝何人?敢入我室";

這種情況下,請求依然是有發出到服務端的,可以從網路請求中看到,但客戶端無法獲取相應的資料

用代理的方式

$host = 'local.b.com';
$url = 'http://local.b.com/index.php';
$ip = '127.0.0.1';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, str_replace($host, $ip, $url));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: {$host}"));
curl_setopt($ch,CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$html = curl_exec($ch);
curl_close($ch);
echo $html;

此時,控制檯就不會有報錯資訊了

這種方式肯定是不可持續的,多了箇中間商的環節,平添了許多成本

最好的方式當然是直接對話,此時就需要讓客戶端攜帶一個標識,服務端檢測到標識後放行

cors

header('Access-Control-Allow-Origin:*');
echo "誰都可以進來";

開放給所有人

這樣顯然不安全,可以指定某個網站

$allow = [
    'http://local.a.com',
    'http://local.c.com',
];

// 獲取來訪域名
$domain = $_SERVER['HTTP_ORIGIN'];
if (in_array($domain, $allow)) {
    header('Access-Control-Allow-Origin:' . $domain);
}
echo "你被翻牌了,今晚就留下吧...";

原文連結

本作品採用《CC 協議》,轉載必須註明作者和本文連結
it書童

相關文章