Skip to content

Commit dc23e7a

Browse files
committed
added csrf protection
1 parent 1941af0 commit dc23e7a

File tree

5 files changed

+19
-3
lines changed

5 files changed

+19
-3
lines changed

Gruntfile.js

+5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ module.exports = function(grunt) {
2626
expand: true, cwd: 'bower_components/jquery/dist/',
2727
src: ['jquery.js'], dest: 'public/vendor/jquery/'
2828
},
29+
{
30+
expand: true, cwd: 'bower_components/jquery.cookie/',
31+
src: ['jquery.cookie.js'], dest: 'public/vendor/jquery.cookie/'
32+
},
2933
{
3034
expand: true, cwd: 'bower_components/momentjs/',
3135
src: ['moment.js'], dest: 'public/vendor/momentjs/'
@@ -93,6 +97,7 @@ module.exports = function(grunt) {
9397
files: {
9498
'public/layouts/core.min.js': [
9599
'public/vendor/jquery/jquery.js',
100+
'public/vendor/jquery.cookie/jquery.cookie.js',
96101
'public/vendor/underscore/underscore.js',
97102
'public/vendor/backbone/backbone.js',
98103
'public/vendor/bootstrap/js/affix.js',

app.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
//dependencies
44
var config = require('./config'),
55
express = require('express'),
6+
cookieParser = require('cookie-parser'),
67
session = require('express-session'),
78
mongoStore = require('connect-mongo')(session),
89
http = require('http'),
910
path = require('path'),
1011
passport = require('passport'),
1112
mongoose = require('mongoose'),
12-
helmet = require('helmet');
13+
helmet = require('helmet'),
14+
csrf = require('csurf');
1315

1416
//create express app
1517
var app = express();
@@ -42,17 +44,19 @@ app.use(require('compression')());
4244
app.use(require('serve-static')(path.join(__dirname, 'public')));
4345
app.use(require('body-parser')());
4446
app.use(require('method-override')());
45-
app.use(require('cookie-parser')());
47+
app.use(cookieParser(config.cryptoKey));
4648
app.use(session({
4749
secret: config.cryptoKey,
4850
store: new mongoStore({ url: config.mongodb.uri })
4951
}));
5052
app.use(passport.initialize());
5153
app.use(passport.session());
54+
app.use(csrf({ cookie: { signed: true } }));
5255
helmet.defaults(app);
5356

5457
//response locals
5558
app.use(function(req, res, next) {
59+
res.cookie('_csrfToken', req.csrfToken());
5660
res.locals.user = {};
5761
res.locals.user.defaultReturnUrl = req.user && req.user.defaultReturnUrl();
5862
res.locals.user.username = req.user && req.user.username;

bower.json

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"font-awesome": "~4.0.3",
77
"html5shiv": "~3.7.0",
88
"jquery": "~1.11.0",
9+
"jquery.cookie": "~1.4.1",
910
"momentjs": "~2.5.0",
1011
"respond": "~1.4.2",
1112
"underscore": "~1.5.2"

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"passport-google-oauth": "^0.1.5",
2929
"passport-tumblr": "^0.1.2",
3030
"helmet": "^0.2.1",
31-
"bcrypt": "^0.7.8"
31+
"bcrypt": "^0.7.8",
32+
"csurf": "^1.4.0"
3233
},
3334
"devDependencies": {
3435
"grunt": "^0.4.4",

public/layouts/core.js

+5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ var app; //the main declaration
1313
//register global ajax handlers
1414
$(document).ajaxStart(function(){ $('.ajax-spinner').show(); });
1515
$(document).ajaxStop(function(){ $('.ajax-spinner').hide(); });
16+
$.ajaxSetup({
17+
beforeSend: function (xhr) {
18+
xhr.setRequestHeader('x-csrf-token', $.cookie('_csrfToken'));
19+
}
20+
});
1621

1722
//ajax spinner follows mouse
1823
$(document).bind('mousemove', function(e) {

0 commit comments

Comments
 (0)