2015-08-16 21 views
0

Так что раньше мне удалось передать токен csrf через форму, в форме журнала. Но не удается передать токен csrf при попытке сменить страницы, нажав на определенный элемент, p.Ajax post дает 403, csrf, node & express

App.js

var csrf = require('csurf'); 
//bunch of requires 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 
var profile = require('./routes/profile'); 
var statistics = require('./routes/statistics'); 

var app = express(); 


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

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 

app.use(logger('dev')); 

//Security shyts 

app.use(helmet()); 
app.use(helmet.xssFilter({ setOnOldIE: true })); 
app.use(helmet.frameguard('deny')); 
app.use(helmet.hsts({maxAge: 7776000000, includeSubdomains: true})); 
app.use(helmet.hidePoweredBy()); 
app.use(helmet.ieNoOpen()); 
app.use(helmet.noSniff()); 
app.use(helmet.noCache()); 

// rest of USE 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(session({secret: 'anystringoftext', saveUninitialized: true, resave: true, httpOnly: true, secure: true})); 
app.use(csrf()); // Security, has to be after cookie and session. 
app.use(flash()); 
app.use(express.static(path.join(__dirname, 'public'))); 

// csrfToken usage 
app.use(function (req, res, next) { 
    var token = req.csrfToken(); 
    res.locals.csrfToken = token; 
    next(); 
}); 

app.use('/', routes); 
app.use('/users', users); 
app.use('/profile', profile); 
app.use('/statistics', statistics); 

//Error handlers 

module.exports = app; 

profileSite.js

$(document).ready(function() { 
    /*Hide elements*/ 
    . 
    . 

    /*Insert elements via effects*/ 
    . 
    . 


// The problem 
    $('#statistics').click(function() { 
     $.post('statistics'); 
    }); 



    /*Fade out elements*/ 
    $('.selection').click(function(){ 
     $('body').fadeOut(500); 
    }); 
    $('.settings').click(function() { 
     $('.layer').fadeToggle(); 
    }); 
    $('.exit').click(function(){ 
     $('.layer').fadeToggle(); 
    }); 
    $('.save').click(function(){ 
     $('.layer').fadeToggle(); 
    }); 
}); 

profile.ejs

<meta name="_csrf" content="<%= csrfToken %>"> 
//A bunch of html tags 

Я также пытался использовать вход, но безрезультатно.

<input type="hidden" name="_csrf" value="<%= csrfToken %>"> 

Profile.js

var express = require('express'); 
var router = express.Router(); 
var connectDB = require('../public/javascripts/connectDB.js'); 

/* GET profile page. */ 
router.get('/', function(req, res, next) { 
//A bunch of queries and stuff 
}); 

router.post('/statistics',function(req,res,next){ 
    console.log('it passed!'); 
    res.redirect('statistics); 
}); 

module.exports = router; 

statistics.js

var express = require('express'); 
var router = express.Router(); 

/* GET statistics listing. */ 
router.get('/profile', function(req, res, next) { 
    res.render('statistics',{title:'stats?'); 
}); 

module.exports = маршрутизатор;

Приносим извинения, если в вопросе вставлено много лишнего кода. Также это ошибка, которую я получаю после нажатия на элемент p.

На IntelliJ:

POST /statistics 403 1.476 ms - 887 

И из консоли браузера:

POST http://localhost:3000/statistics 403 
(Forbidden)n.ajaxTransport.k.cors.a.crossDomain.send @ 
jquery.js:8630n.extend.ajax @ jquery.js:8166n.each.n.(anonymous function) @ 
jquery.js:8311(anonymous function) @ profileSite.js:28n.event.dispatch @ 
jquery.js:4435n.event.add.r.handle @ jquery.js:4121 

Так что я попытался это передать маркер CSRF через данные в $ .post ('статистика', {данные: inputData}) должен иметь данные = _csrf, маркер .. и inputData как csrfToken, req.csrfToken, body.csrfToken ..

ответ

0

это было на самом деле достаточно прост:

$.ajaxSetup({ 
     headers: {'X-CSRF-Token': $('meta[name="_csrf"]').attr('content')} 
    }); 

В файле profileSite.js.

Смежные вопросы