瀏覽器安全之同源策略

同源策略

同源策略是一種約定,它是瀏覽器最核心也是最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能會受到影響.能夠說Web是構建在同源策略的基礎之上的,瀏覽器只是針對同源策略的一種實現.html

瀏覽器的同源策略,限制了來自不一樣源的"document"或腳本,對當前"document"讀取或設置某些屬性.影響"源"的因素有:協議,域名,端口號.
須要注意的是,對於當前頁面來講,頁面存放JavaScript文件的域並不重要,重要的是加載JavaScript頁面所在的域是什麼.跨域

在瀏覽器中,<script>,<img>,<ifram>,<link>等標籤均可以跨域加載資源,而不受同源策略的限制.這些帶"src"屬性的標籤每次加載時,其實是由瀏覽器發起了一次GET請求.不一樣於XMLHttpRequest的是,經過src屬性加載的資源,瀏覽器限制了JavaScript的權限,使其不能讀寫返回的內容.瀏覽器

XMLHttpRequest受到同源策略的約束,不能跨域訪問資源.若是XMLHttpRequest可以跨域訪問資源,則可能會致使一些敏感數據泄露,好比CSRF的token,從而致使發生安全問題.安全

可是互聯網是開放的,隨着業務的發展,跨域請求的需求愈來愈迫切,所以W3C委員會制定了XMLHttpRequest跨域訪問標準.它須要經過目標域返回的HTTP頭來受權是否容許跨域訪問,由於HTTP頭對於JavaScript來講通常是沒法控制的.dom

對於瀏覽器來講,除了DOM,Cookie,XMLHttpRequest會受到同源策略的限制外,瀏覽器加載的一些第三方插件也有各自的同源策略.最多見的一些插件如Flash,Java Applet等都有本身的控制策略.以Flash爲例,它主要經過目標網站提供的crossdomain.xml文件判斷是否容許當前
"源"的Flash跨域訪問目標資源.網站

然而瀏覽器的同源策略也並不是堅如盤石,因爲實現上的一些問題,一些瀏覽器的同源策略也曾經被屢次繞過.好比下面這個IE8的CSS跨域漏洞.url

www.a.com/test.html插件

<body>
{} body {font-family:
aaaaaaaaaaaa
bbbbbbbbbbb

</body>

www.b.com/test2.htmlcode

<style>
@import url("http://www.a.com/test.html")
</style>
<script>
setTimeout(function() {
  var t = document.body.currentStyle.fontFamily;
  alert(t);
},2000);

在"www.b.com/test2.html"彙總經過@import加載了"http://www.a.com/test.html"爲CSS文件,渲染進入當前頁面DOM,同時經過"document.body.currentStyle.fontFamily"訪問內容.問題發生在IE的CSS PARSE的過程當中,IE將fontFamily後面的內容當作了value,從而能夠讀取"www.a.com/test.html"的頁面內容.xml

相關文章
相關標籤/搜索