2016-04-06 19 views
2


NodeJSアプリケーションでcsrfを使用しようとしています。 以下のコードを見ることができます。このコードを実行すると、 "TypeError:req.csrfTokenは関数ではありません"というエラーが表示されます。

すべての要求に対してcsrfトークンを作成し、ajax呼び出しでcsrfトークンをチェックしたいとします。私が言ったように、私はcsrfトークンを作成できません、私はエラーが発生しています。また、ajax呼び出しでcsrfトークンをチェックする方法は?

私を助けることができますか?
おかげNodeJSのCSRFの使用

サーバー側:

var express = require('express'); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var csrf = require('csurf'); 
var bodyParser = require('body-parser'); 

/*this line commented*/ 
//var csrfProtection = csrf({ cookie: false }); 
var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

var parseForm = bodyParser.urlencoded({ extended: false }); 
app.use(cookieParser()); 

/*this line added*/ 
app.use(csrf({ cookie: false })); 

app.use(session({ 
    genid: function (req) { 
     return "lkgktktgjknvfndkj-dfgjnkdfkjgn-dfgdfg"; 
    }, 
    name: "mySecret", 
    resave: false, // don't save session if unmodified 
    saveUninitialized: false, // don't create session until something stored 
    secret: 'thisIsASecret' 
})); 

app.use(express.static(path.join(__dirname, 'public'))); 

app.use(function (req, res, next) { 
    res.locals.csrfToken = req.csrfToken(); 

    next(); 
}); 

app.get('/', /*csrfProtection,*/ function (req, res) { 
    res.render('index') 
}); 

app.post('/process', parseForm, /*csrfProtection,*/ function (req, res) { 
    res.send('data is being processed') 
}); 

Index.jade csrf()返す関数(source)を呼び出す

meta(name="csrf-token", content="#{csrfToken}") 
block content 
    input(type="hidden" name="_csrf" value="#{csrfToken}") 

    |Favorite color: <input type="text" name="favoriteColor"> 
    button(type="submit" id="sbmt") Submit 

    script(src= "/javascripts/jquery-2.2.1.js") 

    script. 
     $.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
      var token; 
      if (!options.crossDomain) { 
      token = $('meta[name="csrf-token"]').attr('content'); 
      if (token) { 
       return jqXHR.setRequestHeader('X-CSRF-Token', token); 
      } 
      } 
     }); 

     $("#sbmt").click(function (e) { 
      e.preventDefault(); 
      $.post(
       "/process", 
       { 
        //text: text, 
        _csrf : $('meta[name="csrf-token"]').attr('content') 
       }, function (data) { 
        console.log(data); 
       }); 
     }); 

答えて

3

あなたが追加する必要があります。

app.use(session({ ... }); 
// Add this after session 
app.use(csrfProtection); 

あなたが追加する必要がありますこのhereが述べたようにセッションの後:

If you are setting the "cookie" option to a non-false value, then you must use cookie-parser before this module. Otherwise, you must use a session middleware before this module. For example: express-session cookie-session

+0

こんにちは、私はこの行にコメントしました:// var csrfProtection = csrf({cookie:false });私はapp.use(csrf({cookie:false}))を追加しました。 cookieparserの後のセッション使用の前に。私はルートでcsrfProtectionの使用を削除しました。今回は "misconfigured csrf"エラーが表示されます。 –

+0

私のコードを編集しました。私に「間違った構成のcsrf」エラーが出ます。 –

+0

私は答えを更新しました。 –

1

。あなたはそれを持っているためにそれをuseする必要があります。 csrfProtectionが実際に呼び出されて、ここで

var csrfProtection = csrf({ cookie: true }) 
app.get('/form', csrfProtection, function(req, res) { 
    // pass the csrfToken to the view 
    res.render('send', { csrfToken: req.csrfToken() }) 
}) 

、それはreqからcsrfTokenメソッドを追加します:あなたはチュートリアルで見逃していることです。他の例ではあります:

app.use(csrf({ cookie: true })) 

ことが可能であろうことなく、すべてルートが保護し、したがって、ノーポストを使用することを意味します。

すべてのルートを保護する場合は、グローバルに使用します(app.use)。それ以外の場合は、リクエストごとに使用します(最初の例のように)。

あなたは、インデックスのルートでそれを使用してみた場合、あなたがそれを持って、あなたがミドルウェアとしてそれを使用しましたので:

app.get('/', csrfProtection, function (req, res) { 
    res.render('index') 
}); 
+0

私は私のコードを編集し、私に「誤って設定CSRF」エラーが発生します。 –

+0

まあ、ちょうどそれgoogle !!! http://stackoverflow.com/questions/23997572/error-misconfigured-csrf-express-js-4 –

+0

これはwalk-me-throughタイプのフォーラムではありません。あなたは何かを尋ねる、あなたは応答を得る。あなたが他の問題を抱えているなら、あなたは新しい質問をし続けます。いくつかの努力をしてドキュメントを読んでみるとよいでしょう。それはすべてそこにあります。 –

関連する問題