客戶端偽造 cookie 的方法和防范

一個朋友有個很古老很古老的網站,使用了asp搭建,流量還很大,最近測試了下 WEB園,性能提升很大。需要改 session 為 cookie 方式保存 會話信息,讓我給提 安全方面的建議。

實際 Session 和 Cookie 除了保存狀態,安全方面都差不多。唯一需要注意的就是 不要 通過 cookie 保存 用戶敏感信息(比如密碼),防止中間人獲取信息。密碼加了md5也不安全,因為還有cmd5.com。另一個需要注意的就是 用戶 可以通過 js 偽造 cookie信息。

以下面的例子為例:

正常 用戶登錄后,會保存 用戶的狀態,比如下面的代碼:

user_name = "user01"
user_level = 1
response.cookies("username01") = user_name
response.cookies("userlevel01") = user_level

其他頁面如果需要判斷用戶登錄信息,可以通過判斷cookie,一般代碼如下:

response.write "<br>用戶: " & request.cookies("username01")
response.write "<br>級別: " & request.cookies("userlevel01")

正常是沒有問題的,加入 用戶比較懂技術,可以通過 js 修改用戶名和級別:

document.cookie='username02=user02';
document.cookie='userlevel02=2';

這樣就悲劇了,如下面的演示,用戶名和級別可以隨便改。

修改方法也比較簡單,在 用戶登錄成功后,增加個 單獨的 cookie,比如hash,代碼如下:

'-----公共配置---------------
salt = "防止被猜出規則,增加的額外的字符串"
'-----其他代碼---------------
user_name = "user01"
user_level = 1
response.cookies("username02") = user_name
response.cookies("userlevel02") = user_level
response.cookies("hash02") = md5(user_name & user_level & salt)

讀取用戶時,讀取 hash 判斷是否相同,如果不同,則cookie被篡改了

'-----公共配置---------------
salt = "防止被猜出規則,增加的額外的字符串"
'-----其他代碼---------------
response.write "<br>用戶: " & request.cookies("username02")
response.write "<br>級別: " & request.cookies("userlevel02")
if request.cookies("hash02") = md5(request.cookies("username02") & request.cookies("userlevel02") & salt) then
	response.write "<br>沒有修改過"
else
	response.write "<br><span style='color:#CC0000'>已經被篡改</span>"
end if

這樣用戶通過JS修改cookie,也會被程序發現的。

document.cookie='username02=user02';
document.cookie='userlevel02=2';

下面的演示可以看到,cookie已經被修改。

所有相關的代碼,已經打包成一個壓縮包,方面大家下載測試:http://www.okfdzs1809.com/products/cookie_test.rar

1 thought on “客戶端偽造 cookie 的方法和防范

  1. amuie

    信息加鹽,在獲取客戶端臉譜信息混合生成驗證就可以了,最后總信息已aes之類加密方式給cookie就好了

    ”簡單的token,根據guid,固定串碼,用戶ip,用戶瀏覽器信息生成
    Public Property Let Token(ByVal s)
    Xp.SetCookie “Token”, Xp.Crypt.Encrypt(Xp.NewID & Request.ServerVariables(“HTTP_USER_AGENT”)), s
    End Property
    Public Property Get Token
    Dim Key, Value : Token = False
    key = Xp.IfHas(Agent, Request.ServerVariables(“HTTP_USER_AGENT”))
    Value = Xp.Crypt.Decrypt(Xp.Cookie(“Token”))
    If Key = Mid(Value, 11) Then Token = Join(Array(Xp.Tpl.FilePath, Xp.Crypt.Sha256(Value & Xp.Crypt.ToKen), Xp.GetIP), “_”)
    End Property

發表評論

電子郵件地址不會被公開。 必填項已用*標注

此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據。