會話固定攻擊(session fixation attack)是利用應用系統在伺服器的會話id固定不變機制,借助他人用相同的會話id獲取認證和授權,然後利用該會話id劫持他人的會話以成功冒充他人,造成會話固定攻擊。
整個攻擊流程是:
防禦固定攻擊非常簡單只需要在使用者登入之後重新生成新的session就行。
在spring security中,使用sessionmanagement(會話管理的配置器)來防禦會話固定攻擊,其防禦策略有四種
)首先要實現invalidsessionstrategy介面
public
class
myinvalidsessionstrategy
implements
invalidsessionstrategy
}
在httpsecurity中進行配置
);預設情況下,一般session的過期時間為一分鐘,可以自定義:
# 單位是s(秒)
server.session.timeout=
60
如果設定小於1分鐘,那麼也會被修正為1分鐘
.
sessionmanagement()
.maximumsessions(2
);
如果沒有特殊配置,新的會話會將舊的會話踢掉如果是需要達到最大數量時,不建立新的會話而不是踢掉舊的會話時,需要如下配置
.
sessionmanagement()
.maximumsession(2
).maxsessionspreventslogin
(true
);
但是上述配置還不過,因為spring security是通過監聽session銷毀事件來觸發會話資訊相關清理工作的,但是如果我們嘗試將舊的會話登出,此時spring security還是會提示會話數量超過了最大設定的併發數量,除非重啟服務,所以我們需要註冊相關的***來使spring security能夠感知到這種變化
如果我們使用之前說過的資料庫來管理使用者的方式:
這樣配置後發現會話併發控制不起作用,原因:
spring security使用會話資訊表來管理使用者的會話狀態,具體實現見sessionregistryimpl類
// 存放使用者以及其所有的sessionid的set
private
final concurrentmap
> principals;
// 存放sessionid以及其對應的sessioninformation
private
final map
sessionids;
principals中:
sessionids中:
可以看出,principals的設計是以userdetails來作為key的,一般來說,如果使用map這種資料結構,如果key是物件的話,一般要重寫這個物件的equals和hashcode方法,否則hashmap不會去重(缺省會以物件的引用位址去計算hashcode),然而我們在實現userdetails的時候並沒有去重寫這兩個方法,所以導致:
所以導致每次登入都會放入乙個新的userdetails,而登出的時候不能夠有效的移除
一般會在集群設定乙個**伺服器作負載均衡(nginx)
如果使用者的登入請求被路由到tomcat1,但是此時tomcat2和3並不知情,在下一次登入如果路由到了tomcat2或者3上,就會發生重複登入的問題
解決方案:
SpringSecurity之自動登入
在spring security中加入自動登入功能 使用這種方案的前提是已經實現了乙個userdetailsservice 前面章節有實現 重啟服務後訪問login頁面會多出乙個remember me的多選框,勾選後登入檢視瀏覽器的cookie會多出乙個 name value remember me...
Spring Security系列之記住我 十二
有這樣乙個場景 有個使用者初訪並登入了你的 然而第二天他又來了,卻必須再次登入。於是就有了 記住我 這樣的功能來方便使用者使用,然而有一件不言自明的事情,那就是這種認證狀態的 曠日持久 早已超出了使用者原本所需要的使用範圍。這意味著,他們可以關閉瀏覽器,然後再關閉電腦,下週或者下個月,乃至更久以後再...
二 Spring Security之密碼加密
override protected void configure authenticationmanagerbuilder auth throws exception 密碼加密,必須為 bean 否則報錯 作用 例項化密碼加密規則,該規則首先會校驗資料庫中儲存的密碼是否符合其規則 經過 bcryp...