2017-10-11 85 views
0

有一個模擬瀏覽器行爲的Java代碼。它與Tomcat服務器進行有狀態對話,例如:login,doSomething,註銷。在與Tomcat Web服務器進行對話期間,我應該檢查JSESSIONID是否更改?

當前的實現是這樣的:

  1. HTTP POST到 「登錄」 頁面,存儲的cookie返回(假設它是JSESSIONID = 9845)。
  2. HTTP POST到 「DoSomething的」 頁面,通存儲的cookie(JSESSIONID = 9845)與請求,做什麼用的響應頭(忽略進一步餅乾)
  3. HTTP GET到 「註銷」 頁面,通過存儲的cookie(JSESSIONID = 9845)與請求。

這工作正常。

但是我不知道這是否是安全的忽略響應報頭在步驟2中我應該期待的服務器會話期間改變JSESSIONID的,還是沒有?

換句話說,如果在步驟2中該做什麼,服務器會在響應頭文件中返回Set-Cookie = [JSESSIONID = 9846]?

我能想象如下:

  1. 這不可能發生在現實生活,不值得檢查,當前的代碼是好的。
  2. 這標誌着一個嚴重的問題Tomcat服務器,值得一檢查,代碼應停止談話沒有進一步的呼叫
  3. 它是合法的,Tomcat服務器只是想用會話的新標識,所以我有以存儲新值,並將其用於隨後的調用。當前的代碼應該完成。

我猜,真正的瀏覽器從上面的3.選項,但也許1.和2.選項也可以接受?

+0

真正的瀏覽器會做3.是否tomcat實際上會重新編號會話是一個不同的問題(我認爲這是不太可能的**,**除*會話失效*,即註銷)。 –

回答

1

通常會話在登錄和註銷時發生變化,這意味着您可以期望在很大程度上是安全的(但是隻讀,我只是說「通常」)。你問是否可以忽略HTTP規範是安全的 - 我認爲這不是,因爲總是會有意想不到的變化讓你的應用難以維護或升級基礎架構。如果有一天,你開始在具有粘性會話的羣集上部署你的應用程序,tomcat會在羣集機器上標記會話ID,例如,您的會話標識符將看起來像9846;node3。儘管這通常不會改變,但是當節點3關閉並且下一個請求重新平衡到另一個節點時:9846;node1。如果你的「登錄,做某件事,註銷」操作總是半原子的(例如立即跟隨對方),那麼節點3在三個請求之間停機的可能性可能可以忽略不計。如果你將會議保持開放一段時間,你可能想要侃侃而談這樣的事件。

總結:建議忽略HTTP規範嗎?不會,你很可能逃避這樣做:你決定。我舉了一個例子,它可能會咬你,可能會提前幾年。你可能很容易逃脫。如果你忽略規範,你的實現可能會更容易(維護)。但是這個錯誤很難找到,因爲這些問題可能在將來出現時看似隨機且罕見,例如,一個調試噩夢。

+0

謝謝奧拉夫,我正在看起來像這樣!具有會話複製的粘性會話是一種真實的場景,通過在登錄後忽略JSESSIONID更改而忽略http規範是危險的。現在我有一個很好的理由來解決這個問題,謝謝! – riskop

+0

只是這個案例的一個側面說明;如果羣集能夠在node3關閉後將JSASIONID = 9845; node3傳遞給node1到達節點1,那麼我認爲它將能夠將進一步的請求與JSESSIONID = 9845; node3一起指向工作節點。所以我非常肯定,客戶端能夠正確地完成它的會話,而不會注意到會話cookie的路由部分被更改。但是這種情況永遠不會少於在有狀態會話期間會話cookie更改其值的情況的一個好例子。 – riskop

相關問題