Cookies
cookies 特性
- 前端資料存盤
- 后端通過 HTTP 頭設定
- 請求時通過 HTTP 頭傳給后端
- 前端可讀可寫
- 遵守同源策略
- 域名
- 有效期
- 路徑
- http-only
- secure(https)
cookies 作用
- 存盤個性化設定
- 存盤未登錄時用戶唯一標識
- 存盤已登錄用戶的憑證
- 存盤其他業務資料
Cookies-登錄用戶憑證
-
前端提交用戶名和密碼
-
后端驗證用戶名和密碼
-
后端通過 http 頭設定用戶憑證
-
后續訪問時后端先驗證用戶憑證
-
驗證用戶 ID
-
ID+簽名
生成復雜字串
var crypt = {}
const KET = '#$%489!#$%&*156sd'
crypt.cryptUserId = function(userId){
var crypto = require('crypto);
var sign = crypto.createHmac('sha256,KEY');
sign.updata(userId + '');
return sign.digest('hex');
}
module.exports = crypt;
進行設定
//登陸成功,設定Cookies
ctx.cookies.set("sign", crypt.cryptUserId(user.id), {
httpOnly: false,
sameSite: "strict"
});
ctx.cookies.set("userId", user.id, {
httpOnly: false,
sameSite: "strict"
});
驗證
var userId = ctx.cookies.get("userId");
var sign = ctx.cookies.get("sign");
var correctSign = crypt.cryptUserId(userId);
if (correctSign !== sign) {
throw new Errow("報告,有人入侵");
}
上面代碼,可防御,篡改的 UserId 的入侵
- SessionId
sessionId 為隨機生成的字串,第三方拿不到,就無法入侵
生成復雜字串
var session = {};
session.set = function(userId, obj) {
var sessionId = Math.random();
if (!cache[sessionId]) {
cache[sessionId] = {};
}
cache[sessionId].conntent = obj;
return sessionId;
};
session.get = function(userId) {
return cache[session] && cache[sessionId].content;
};
module.exports = session;
進行設定
var sessionId = session.set(user.id, {
userId: user.id
});
ctx.cookies.set("sessionId", sessionId, {
httpOnly: ture,
sameSite: "strict"
});
驗證
var sessionId = ctx.cookies.get("sessionId");
var sessionObj = session.get(sessionId);
if (!sessionObj || !sessionObj) {
throw new Error("session不存在");
}
var userId = sessionObj.userId;
sessionId 需要持久化,存入資料庫,因為記憶體是有限的,都存在記憶體中,服務器會出問題
Cookies 其他
-
Cookies 與 XSS 的關系
- XSS 可能偷取 Cookies
- http-only 的 Cookies 不會被偷
-
Cookies 與 CSRF 的關系
- CSRF 利用了用戶 Cookies
- 攻擊站點無法讀寫 Cookies
- 最好能阻止第三方使用 Cookies
-
Cookies 安全案例
- 某學校教務處
- 某學校教務系統使用了開源的 CMS
- 改 CMS 使用 username 作為唯一用戶標識
- 改 CMS 文章作者暴露了 username
- 可使用任意的 username 登錄后臺
- 某論壇
- 某論壇使用了某開源的 ASP BBS 程式
- 改 ASP 程式使用用戶 ID 作為用戶標識
- 可偽造任意用戶登錄
- 某學校教務處
Cookies-安全策略
- 簽名防篡改
- 私有變換(加密)
- http-only(防止 XSS)
- secure(僅允許 https 協議下使用 Cookies)
- same-site(很好地策略,但不是所有瀏覽器都支持)
加密與解密
npm install crypto
var crypto = require("crypto");
var KEY = "#$%^156ssc#$%";
var cipher = crypto.createCipher("des", KEY);
var text = cipher.update("hello word", "utf8", "hex");
text += cipher.final("hex");
console.log(text);//加密后的
var decipher = crypto.createDecipher("des", KEY);
var originalText = decipher.update(text, "hex", "utf8");
console.log(originalText);//原來的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/3944.html
標籤:訊息安全
上一篇:CSRF攻擊與防御
下一篇:前端點擊劫持
