2016-11-21 88 views
0

假設我使用用戶代理頭來查看使用哪個瀏覽器(如果有)以幫助我抵禦潛在的CSRF攻擊。雖然我知道有大量的CSRF防禦措施不需要用戶代理標題,但我只想知道用戶代理標題的安全性 - CSRF攻擊者是否可以將其修改爲任何他希望的內容?CSRF攻擊:你能用javascript來修改用戶代理頭嗎?

我知道起源頭和參照標頭是從這樣的修改很好的保護,因爲它們是forbidden headers。然而,用戶代理標題看起來不是。

這是否意味着一個CSRF攻擊者可以平凡改變User-Agent頭?根據this,這是不能做到的。但是我想知道爲什麼它不被列爲'禁止'。有什麼我誤解?它是否與Referer和Origin頭文件一樣受保護?

在此先感謝。

+0

如果您問用戶是否可以欺騙他們的用戶代理,那麼答案是肯定的。 [變得非常容易。](http://www.howtogeek.com/113439/how-to-change-your-browsers-user-agent-without-installing-any-extensions/) –

+0

應該是什麼優點黑客修改用戶代理標題? – gus27

+0

是的,用戶可以欺騙他們的用戶代理。他們也可以欺騙他們的起源標題,以及他們的引用標題。但是,CSRF攻擊者無法欺騙其來源或引用標題,因爲他們無法控制用戶的瀏覽器。那麼用戶代理頭呢? – ineedahero

回答

0

顯然,用戶代理只是一個請求標題,如果我們正在討論瀏覽器以外的任何請求,或者不同的瀏覽器擴展或工具,可以很容易僞造

用JavaScript在瀏覽器中運行(如例如在CSRF的情況),情況參差不齊。使用良好的舊XmlHttpRequest接口,這是不可能的,你不能改變User-Agent頭。但是,Chrome 43+,Edge 14+,Firefox 39+和Opera 29+支持新的Fetch API,但IE和Safari不支持。即使在支持瀏覽器中,也存在差異。

考慮以下代碼:

var myHeaders = new Headers(); 
myHeaders.append("User-Agent", "anything you like"); 

var setup = { method: 'GET', 
       headers: myHeaders, 
       mode: 'cors', 
       cache: 'default' }; 

fetch('somefile.txt', setup) 
.then(function(response) { 
    return response.blob(); 
}); 

我在Chrome 54.0.2840.100想這對Linux和用戶代理的請求是默認的Chrome用戶代理。但是,在Firefox 50.0中運行它確實會發送自定義用戶代理。

因此很明顯,它應該根據獲取規格是可能的,但瀏覽器不同的方式實現這一切如常。

此外,如果插件安裝在瀏覽器(尤其是舊版本的Java或Flash),這些可以允許請求頭一樣的Referer,產地或用戶代理的鍛造。