2008-08-26 165 views
172

如果在基於cookie的訪問限制的站點上使用AJAX,則JavaScript需要訪問cookie。 HttpOnly cookie會在AJAX網站上運行嗎?HttpOnly Cookie如何處理AJAX請求?

編輯:如果指定了HttpOnly,Microsoft創建了一種防止XSS攻擊的方法,即禁止JavaScript訪問cookie。 FireFox後來採納了這一點。所以我的問題是:如果您在站點上使用AJAX,比如StackOverflow,Http專用Cookie是一個選項嗎?

編輯2:問題2.如果僅Http的目的是爲了防止JavaScript的訪問餅乾,你仍然可以通過XMLHttpRequest對象檢索通過JavaScript的餅乾,什麼的HttpOnly點?

編輯3:下面是來自維基百科報價:

當瀏覽器接收到這樣一個cookie,它應該在以下的HTTP交流,使用它像往常一樣,但不使其可見到客戶端腳本。[32] HttpOnly標誌不是任何標準的一部分,並沒有在所有瀏覽器中實現。請注意,目前沒有通過XMLHTTPRequest來讀取或寫入會話cookie的預防。 [33]。

我知道document.cookie在使用HttpOnly時被阻止。但似乎你仍然可以讀取XMLHttpRequest對象中的cookie值,從而允許XSS。 HttpOnly如何讓你更安全?通過使cookie基本上只讀?

在您的示例中,我無法寫入document.cookie,但我仍然可以竊取您的Cookie並使用XMLHttpRequest對象將其發佈到我的域。

<script type="text/javascript"> 
    var req = null; 
    try { req = new XMLHttpRequest(); } catch(e) {} 
    if (!req) try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} 
    if (!req) try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} 
    req.open('GET', 'http://stackoverflow.com/', false); 
    req.send(null); 
    alert(req.getAllResponseHeaders()); 
</script> 

編輯4:對不起,我的意思是,你可以發送了XMLHttpRequest到StackOverflow的域,然後)保存getAllResponseHeaders的結果(爲字符串,正則表達式出來的餅乾,然後張貼到一個外部域。看來,維基百科和ha.ckers我同意就這一個,但我會愛再教育......

最後編輯:啊,顯然這兩個網站都是錯誤的,這其實是一個bug in FireFox。 IE6 & 7實際上是目前完全支持HttpOnly的唯一瀏覽器。

重申一切我已經學會:

  • 僅Http限制所有訪問的document.cookie在IE7 &和FireFox(其他瀏覽器不知道)
  • 的HttpOnly去除響應標頭中的cookie信息XMLHttpObject.getAllResponseHeaders()在IE7中。
  • XMLHttpObjects只能提交給它們的域名,所以沒有跨域發佈cookies。

編輯:此信息可能不再是最新的。

+0

我把你的例子放在一個greasemonkey腳本中,它看起來像FF不再顯示cookie。優秀的研究和範例。 – 2010-07-14 22:09:03

+0

可能具有相同原始策略,您不能向運行腳本的域不同的http請求;不過,我相信你可以通過使用window.location將用戶重定向到一個頁面並通過查詢字符串參數傳遞信息來輕鬆地傳遞cookie。 – 2016-06-09 08:38:29

回答

3

不一定,這取決於你想要做什麼。你能詳細說明一下嗎? AJAX不需要訪問cookie來工作,它可以自己提出請求來提取信息,AJAX調用所產生的頁面請求可以訪問cookie數據&通過返回調用腳本而不需要Javascript直接訪問餅乾

0

不,AJAX調用請求訪問餅乾太&這就是檢查你是否在已經登錄的頁面。

你可以做其他的認證使用JavaScript,但我不相信它,我總是更喜歡在後端進行任何類型的身份驗證檢查。

1

當您進行AJAX調用時,Cookie由瀏覽器自動處理,因此不需要使用JavaScript來搞亂Cookie。

1

因此,我認爲JavaScript需要訪問您的Cookie。

來自瀏覽器的所有HTTP請求都會傳輸您所查詢網站的Cookie信息。 JavaScript可以設置和讀取cookie。 Cookie不是Ajax應用程序定義所必需的,但它們是大多數Web應用程序維護用戶狀態所必需的。

正如你所說的問題的答案 - 「如果使用AJAX,JavaScript是否需要訪問cookie?」 - 因此是「不」。例如,想一想使用Ajax請求提供自動建議選項的增強搜索字段。在這種情況下,不需要cookie信息。

+0

XmlHttpRequest需要cookies。您提到的增強型搜索可能位於登錄頁面後面。但是,Javascript是否需要能夠將cookie值展示給虛擬機是另一個問題。 – 2009-03-23 15:54:28

1

作爲澄清 - 從服務器的角度來看,AJAX請求所請求的頁面與用戶單擊鏈接完成的標準HTTP請求基本上沒有什麼不同。所有正常的請求屬性:用戶代理,IP,會話,cookie等都被傳遞給服務器。

55

是的,僅限HTTP的cookie對此功能可以很好。他們仍然會提供XmlHttpRequest的請求到服務器。

在堆棧溢出的情況下,cookie會自動作爲XmlHttpRequest請求的一部分提供。我不知道該堆棧溢出的身份驗證提供者的實現細節,但該cookie數據可能會自動使用在比「投票」控制器方法較低的水平,以驗證您的身份。

更一般地說,Cookie是而不是所需的AJAX。支持XmlHttpRequest(或者甚至是在舊版瀏覽器上的內置框架遠程處理)是技術上需要的。

但是,如果你想提供安全的AJAX啓用功能,則適用同樣的規則與傳統的網站。您需要一些方法來識別每個請求後面的用戶,並且Cookie幾乎總是達到此目的的手段。

在您的示例中,我無法寫入到您的document.cookie,但我仍然可以竊取您的cookie並使用XMLHttpRequest對象將其發佈到我的域。

XmlHttpRequest不會發出跨域請求(正是因爲你觸及的原因)。

你通常可以注入腳本使用iframe的遠程處理或JSONP的cookie發送給您的域名,但當時僅HTTP再次保護cookie的,因爲它是不可訪問。

除非你已經破壞StackOverflow.com在服務器端,你就不能偷我的cookie。

編輯2:問題2.如果僅HTTP的目的是爲了防止JavaScript的訪問餅乾,你仍然可以通過XMLHttpRequest對象檢索通過JavaScript餅乾,什麼是僅HTTP的意義呢?

考慮這種情況:

  • 我找到一個途徑,注入的JavaScript代碼到頁面中。
  • Jeff加載頁面,我的惡意JavaScript會修改其cookie以匹配我的頁面。
  • Jeff對您的問題提出了一個很好的答案。
  • 因爲他與我的Cookie數據,而不是他提交後,答案會變成我的。
  • 你投票「我的」恆星的答案。
  • 我的真實賬戶明白了。

對於僅限HTTP的cookie,第二步將不可能,從而破壞我的XSS嘗試。

編輯4:對不起,我的意思是,你可以發送了XMLHttpRequest到StackOverflow的域,然後保存getAllResponseHeaders()爲字符串的結果,正則表達式了餅乾,然後張貼到外部域。看起來,維基百科和ha.ckers對此表示贊同,但我很樂意接受再教育......

這是正確的。你仍然可以以這種方式劫持會話。儘管如此,它確實可以顯着減少那些能夠成功執行XSS攻擊的人羣。但是,如果回到我的示例場景中,可以看到HTTP-Only 確實成功地切斷了依賴於修改客戶端Cookie(非常見)的XSS攻擊。

它歸結爲一個事實)沒有單一的改善將解決所有漏洞和b)沒有系統將永遠是完全安全的。 HTTP-Only 是支持XSS的有用工具。

同樣,即使上的XmlHttpRequest跨域限制不是100%成功地防止所有XSS攻擊,你還從來沒有做過去除限制。

2

是的,他們是一個基於Ajax網站的一個可行的選擇。身份驗證Cookie不適用於腳本操作,但僅由瀏覽器在向服務器發出的所有HTTP請求中包含。

腳本不需要擔心什麼會話cookie說 - 只要你進行身份驗證,然後由用戶或腳本啓動服務器的任何請求將包括合適的Cookie。腳本本身不知道cookie的內容的事實並不重要。

對於任何用於驗證以外目的的cookie,如果您希望腳本能夠修改或讀取這些cookie,則可以在沒有HTTP only標誌的情況下設置這些cookie。您可以挑選和選擇哪些Cookie應該僅用於HTTP,因此,例如任何非UI敏感的內容(排序順序,摺疊左側窗格或不顯示)都可以在Cookie中與腳本共享。

我真的很喜歡HTTP只有cookie - 它是那些專有的瀏覽器擴展之一,是一個非常整潔的想法。

0

是的,cookie對Ajax非常有用。

將驗證放入請求URL是不好的做法。上週有一篇關於從谷歌緩存中獲取URL中的認證令牌的新聞。

不,沒有辦法阻止攻擊。舊版瀏覽器仍然允許通過javascript輕鬆訪問cookie。你可以繞過http等。無論你想出什麼,都可以得到足夠的努力。訣竅是要付出太多的努力才值得。

如果您想讓您的網站更安全(沒有完美的安全性),您可以使用過期的身份驗證cookie。然後,如果cookie被盜,攻擊者必須在它到期之前使用它。如果他們不這樣做,那麼您很好地指出該賬戶存在可疑活動。時間窗口越短,安全性越好,但服務器生成和維護密鑰的負載越大。

2

這還有一點。

Ajax並不嚴格要求cookies,但它們可以用作其他海報的提及。標記一個cookie HTTPOnly以隱藏腳本只能部分工作,因爲不是所有的瀏覽器都支持它,而且還有一些常見的解決方法。

XMLHTTPresponse標頭給出的cookie很奇怪,從技術上講,服務器不必返回帶有響應的cookie。一旦它在客戶端上設置,它將保持設置狀態直到它到期。儘管有一些方案可以在每次請求時更改cookie以防止重複使用。因此,您可以通過將服務器更改爲不提供XMLHTTP響應中的cookie來避免該解決方法。

一般來說,我認爲HTTPOnly應該謹慎使用。有跨站點腳本攻擊,攻擊者安排用戶使用簡單的發佈表單提交源自其他站點的類似Ajax的請求,而不使用XMLHTTP,並且瀏覽器的仍然活動的cookie將驗證請求。

如果你想確保一個AJAX請求被認證,請求本身和HTTP頭需要包含cookie。例如通過使用腳本或獨特的隱藏輸入。 HTTPOnly會阻止。

通常希望HTTPOnly的有趣的理由是爲了防止您的網頁上包含的第三方內容竊取cookie。但有很多有趣的理由要對第三方內容加以謹慎,並積極地進行過濾。