關於 Cookie的一些問題
发布于 10 年前 作者 mingvsfate 3278 次浏览 最后一次编辑是 8 年前

最近正在學習 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

問題:

  1. 是哪些原因造成這些總總原因?
  2. 我想要讓 cookie 內容為加密狀態,除了自己加密 cookie 內容在丟給客戶瀏覽器之外,有沒有更優雅的方式?
  3. 最後一段修改實驗,第一次讀入的修改數據會是正常的,第二次就會被修改成空 {} 是何原因? 感謝!
2 回复

这个secret是用于防篡改标记session的那个cookie值的

cookie里放的内容就应该不怕客户端看,不想泄漏的话那就放到session里吧。

回到顶部