2014-01-20 35 views
1

我試圖在express中生成CSRF令牌。我檢查了相關的查詢,他們似乎都沒有幫助我。我在我的app.js下面的代碼使用csrf時禁止訪問(express + node)

var app = express(); 
var connect = require('connect'); 
// Disable CSRF for some requests 
var conditionalCSRF = function (req, res, next) { 
    var whitelist = ['/login']; 

    if (req.method !== 'POST') { 
     next(); 
     return; 
    } 
    if (whitelist.indexOf(req.url) !== -1) { 
     next(); 
    } else { 
     //req.session._csrf || (req.session._csrf = connect.utils.uid(24)); 
     (express.csrf())(req, res, next); 
    } 
}; 

app.configure(function() { 
    app.use(passport.initialize()); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(passport.session()); 
    app.use(express.session({ 
     secret: 'applecake', 
     key: 'sid', 
     cookie : { 
      maxAge : 604800, 
      path:"/" 
     } 
    })); 
    app.use(conditionalCSRF); 
    app.use(app.router); 
    app.use(express.errorHandler()); 
}); 

我的形式是一個簡單的形式,這樣

<form action="http://localhost:3000/conversationlist" method="post"> 

<div> 
    <input type="hidden" name="_csrf" value=token /> 
</div> 

<div> 
    <input type="submit" value="Get ConversationList"/> 
</div> 

我登錄使用/登錄URI和工作正常,這是不CSRF保護的一部分。有一次,我嘗試任何其他URI,

我沒有看到CSRF令牌被設置,也是我收到一個消息,禁止

Express 
403 Error: Forbidden 
at Object.exports.error (C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\lib\utils.js:63:13) 
at createToken (C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\lib\middleware\csrf.js:82:55) 
at C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\lib\middleware\csrf.js:54:7 
at Object.ondone (C:\Career\Node.JS\ExpressCHLogging\node_modules\express\node_modules\connect\node_modules\uid2\index.js:46:8) 

爲什麼我收到禁止訪問任何想法。

+0

你可以請你發佈你的路由處理程序,顯示你如何溝通'標記'到你的視圖? – juanpaco

+0

app.post('/ sessionlist',ensureAuthenticated,function(req,res){ \t conversationlist.start(req,res,req.session.cn); });這就是我所嘗試的URL。對於身份驗證,我使用護照,並在/登錄期間被調用。 – user2731628

+0

具體來說,你設置了'''token'從哪裏來?你是否在某個地方通過了「res.render」電話? – juanpaco

回答

0

確保您的token變量可用於您的渲染引擎。

例如,如果你使用痛飲,那麼你應該用花括號括住它,像這樣:

<input type="hidden" name="_csrf" value={{ token }} /> 

可以確保令牌正確生成在瀏覽器中打開表單和看着頁面的源代碼。如果csrf值已正確分配,它將顯示在token的位置,否則它將爲空。