抱歉 雖然在其他論壇上有些人給我了一些建議,但有點複雜,來這邊問問看有沒有什麼其他的方法能解決。
關於 Session Fixationx漏洞 他的修復方法有>用戶登入後重置SessionID(ASP.net 是叫做ASP.net_SessionID 沒錯吧?)
我的網頁登入畫面,一進入就有生成ASP.net_SessionID(F12看的
那這個漏洞修復方法應該就是登入進去後 ASP.net_SessionID 要改變對吧?
但我也有看了其他文章,他們都在Login按鈕裡寫上:
Session.Clear();
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionID",""));
我也在我的登入按鈕中加入,但這樣沒辦法登入,應該如何解決呢?
Session Fixation(固定 Session ID)
通常攻擊者會藉由以下資源再進行存取
URL
cookie
hidden field
取得有效的session id後就能駭入
防範方案
1.禁用GET (URL)傳遞Session ID
2.登入後要記得更新session id
在asp.net技術中
當使用者登入進系統會多存一個
叫"ASP.NET_SessionId"的cookie
在client side browser
所以你在logout事件無論是執行下列何種方法
Session.Abandon()
Session.Clear()
Session.RemoveAll()
都不會把client side的cookie存的session id清掉
這些都只是從server side記憶體清除的
所以不能只有做這幾個動作
還要記得去判斷Request.Cookies["ASP.NET_SessionId"] 是否為空
將其清掉設空字串之類的或設置有效期限
Response.Cookies["ASP.NET_SessionId"].Value = "";
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddDays(-1d);
建議在登入跟登出都多增加一個唯一性隨機產生的AuthToken
Cookies加上去也可以
請問 登入後如何更新 SessionID呢?
做在logout事件
第一種.
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
第二種.
Response.Cookies["ASP.NET_SessionId"].Value = "";
登入事件中不能call這幾個method這樣你session都被清光了
Session.Abandon()
Session.Clear()
Session.RemoveAll()
至於重新更新session id是在其他程式語言特性實作方式不同
https://ithelp.ithome.com.tw/articles/10246787?sc=iThelpR
Session Fixation在其他程式語言或框架處理機制都不同
有些說更新session id是因為他們有支援這種機制
asp.net裡面沒有像php這種方便機制
https://stackoverflow.com/questions/38138682/how-to-change-sessionid-after-login-in-net
通常就只會在登出時把SessionID清除而已
當然更嚴謹一點可到config 設定sessionState timeout
這種時候就得吹一下Django了,都幫你包在logout這函式裡。
能問一下這篇文章的示例嗎
https://www.codeproject.com/Articles/210993/Session-Fixation-vulnerability-in-ASP-NET
他的方法 在登入時給一個GUID 存在cookie中 之後去做比對
那我想問的是 我要如何拿驗證過的ASP.net_Session去做登入的動作呢?
它那種多綁定一個自己每次登入隨機產生的token做法
就是多加一道密碼鎖概念
怕今天session id已經被拿到
但是因為PageLoad 每次Postback事件都會去多比對那個 token
所以不再是只有比對session id
因為每一次登入都會多隨機產生一個GUID存在Server
這樣子也可以讓其他台電腦可能已經竊取session id登入的失效
因為不知道現在server上存的token在新一次登入後產生的結果為何,也是另一種形式的CSRF
有什麼方法能用已驗證過的 ASP.net_SessionId 去測試看看嗎