最近正在學習 ndoe.js 的 cookie 相關操作,發現一個問題:
app.configure(function() {
app.use(express.cookieParser('jfvstest'));
app.use(express.cookieSession( {
key: 'test',
secret: 'HelloExpressSESSION'
}));
app.get('/google', function(req, res) {
req.session.google = "google";
req.session.password = "123456";
console.log(req.cookies);
res.send("ok");
res.end();
});
我用瀏覽器套件觀察 cookie value 發現基本上依然是明文:
s%3Aj%3A%7B%22google%22%3A%22google%22%2C%22password%22%3A%22123456%22%7D.T0VjxprKtgC80%2Fuhfcs62mSsoe7sNC2Eo9KpV%2Bt0xr0
書上寫說 secret 的用途是:
Express 需要使用這組 secret 字串去加密 cookie,以防 cookie被破解。
有用 secret 的話,貌似依然是明文? (實際驗證的方式是我寫了另外一個 test.js 用,沒有相關 secret,使用:
console.log(req.cookies)
可以直接得到明文:
{ test: 's:j:{"google":"google","password":"123456"}.rsAPPiLlP6Of0KWqCxdRIxfR2NHKL3ibs+ZSIZq3gn4' }
secret 改變的話,實際影響的只有 rsAPPiLlP6Of0KWqCxdRIxfR2NHKL3ibs+ZSIZq3gn4 這串,可是 會話cookie 會完全明文存在客戶端。
我又做了一個小實驗,我在瀏覽器中修改
s%3Aj%3A%7B%22google%22%3A%22google%22%2C%22password%22%3A%22123456%22%7D.T0VjxprKtgC80%2Fuhfcs62mSsoe7sNC2Eo9KpV%2Bt0xr0
將 google 改成 gosogle,在 console.log(req.cookies)
三次:
{ ming: ‘s:j:{"gosogle":"google","password":"123456"}.OiVYufTj5DIdmvBy7/f03poRosZ/Vwwf1rYzGCQ1Z7o’ }
{ ming: ‘s:j:{}.jNSi4gEWlIHY0qiHpvD4By+LOak9MErZOoOCAqh/oQM’ }
{ ming: ‘s:j:{}.jNSi4gEWlIHY0qiHpvD4By+LOak9MErZOoOCAqh/oQM’ }
第一次得到的是我修改過的內容,第二次直接變成空值,再用瀏覽器看 cookie 值:
s%3Aj%3A%7B%7D.jNSi4gEWlIHY0qiHpvD4By%2BLOak9MErZOoOCAqh%2FoQM
有別於:
s%3Aj%3A%7B%22google%22%3A%22google%22%2C%22password%22%3A%22123456%22%7D.T0VjxprKtgC80%2Fuhfcs62mSsoe7sNC2Eo9KpV%2Bt0xr0
問題:
- 是哪些原因造成這些總總原因?
- 我想要讓 cookie 內容為加密狀態,除了自己加密 cookie 內容在丟給客戶瀏覽器之外,有沒有更優雅的方式?
- 最後一段修改實驗,第一次讀入的修改數據會是正常的,第二次就會被修改成空 {} 是何原因? 感謝!