後續訪問時後端先驗證用戶憑證javascript
ID+簽名前端
生成複雜字符串java
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" });
驗證npm
var userId = ctx.cookies.get("userId"); var sign = ctx.cookies.get("sign"); var correctSign = crypt.cryptUserId(userId); if (correctSign !== sign) { throw new Errow("報告,有人入侵"); }
上面代碼,可防護,篡改的 UserId 的入侵c#
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 與 CSRF 的關係
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);//原來的