4

以前のSOの質問に従って、csrfミドルウェアがエクスプレスで動作するようになりました。トークンは正常に生成されますが、すべてのフォーム送信が拒否されます。

私が見ることができる唯一の可能な競合は、connect-redisを使用してセッションストアとしてredisを使用し、socket.ioをセッションにプラグインしていることですが、ソケットビットをコメントアウトしましたが、それでもうまく機能していません。

これは、私がミドルウェアと呼んでいる順序です。

(CoffeeScript)

app.configure ->
    app.set 'views', __dirname + '/views'
    app.set 'view engine', 'jade'
    app.use express.bodyParser()
    app.use express.methodOverride()
    app.use express.cookieParser()
    app.use express.session
        secret: "itsasecret"
        store: sessionStore
    app.use express.csrf()
    app.dynamicHelpers
        token: (req, res) ->
        req.session._csrf
    app.use app.router
    app.use express.static(__dirname + '/public')

投稿されたデータに対応するルートです。

(これは開発コードではありません。私がノードを学習しているだけです。オンラインにすると、これは怪物になることをよく知っています)

app.post '/admin/logintry', (req, res) ->
    if req.body.username is 'Tim' and req.body.password is 'TempPassword'
        req.session.adminIn = true
        res.redirect '/admin/home'
    else
        res.redirect '/admin/login?failed=true'

フォームページでブラウザに到達しているHTMLは次のとおりです。

<input type="hidden" token="5ODFxml1QAhQvOmq1QE6Qd7n">

そして、「/ admin / logintry」から受け取った応答:

Forbidden

Node、Express、SOは初めてで、最近正しく学習されたjavascriptであり、どこから問題を探し始めるのかさえわかりません。掘り始めた場所だけでも、どんな助けでも大歓迎です。

乾杯。

4

1 に答える 1

4

Connect - csrf documentationを見ると、トークンのinputタグは次のようになります。

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

したがって、トークンの例では:

<input type="hidden" name="_csrf" value="5ODFxml1QAhQvOmq1QE6Qd7n" />

現在、Connect (Express は内部で Connect を使用) は「_csrf」という名前のフィールドを見つけようとしていますが、フォームに存在しないため見つかりません。したがって、アクセスを禁止します。

于 2012-04-09T08:14:58.707 に答える