Skip to content

Commit

Permalink
Merge pull request #23 from SLIIT-Y4S2/it21012488
Browse files Browse the repository at this point in the history
CSRF vulnerability fix
  • Loading branch information
shavindaL committed Sep 26, 2024
2 parents be0c7c6 + de50f14 commit 4bc0df9
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 2 deletions.
11 changes: 11 additions & 0 deletions client/src/components/CustomerAccount.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,20 @@ function CustomerAccount() {
console.log("Feedback "+sFeedback)
const siteFeedback = { name, sFeedback, email}

const csrfResponse = await fetch('/csrf/generate', {
method: 'GET',
credentials: 'include'
})
const csrfData = await csrfResponse.json();
const csrfToken = csrfData.csrfToken;
console.log("csrfToken", csrfToken);

const response = await fetch('/api/site-feedbacks', {
method: 'POST',
credentials: 'include',
body: JSON.stringify(siteFeedback),
headers: {
'x-csrf-token': csrfToken, // Include the CSRF token in the header
'Content-Type': 'application/json'
}
})
Expand All @@ -128,6 +138,7 @@ function CustomerAccount() {
}

if (response.ok) {
alert('New feedback added');
console.log('new feedback added', json)
window.location.reload();
}
Expand Down
19 changes: 19 additions & 0 deletions server/controllers/csrf-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
require("dotenv").config();

const { doubleCsrf } = require("csrf-csrf");

const doubleCsrfConfig = {
getSecret: () => process.env.CSRF_SECRET, // A function that optionally takes the request and returns a secret
};

const { generateToken, doubleCsrfProtection } = doubleCsrf(doubleCsrfConfig);

const generateCsrfToken = (req, res) => {
const csrfToken = generateToken(req, res);
res.json({ csrfToken });
};

module.exports = {
generateCsrfToken,
doubleCsrfProtection,
};
57 changes: 57 additions & 0 deletions server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
"license": "ISC",
"dependencies": {
"bcrypt": "^5.1.1",
"cookie-parser": "^1.4.6",
"cookie-session": "^2.1.0",
"cors": "^2.8.5",
"csrf-csrf": "^3.0.8",
"dotenv": "^16.4.5",
"express": "^4.21.0",
"express-rate-limit": "^7.4.0",
Expand All @@ -28,4 +30,4 @@
"passport": "^0.5.3",
"passport-google-oauth20": "^2.0.0"
}
}
}
3 changes: 2 additions & 1 deletion server/routes/SiteFeedbackRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const {
updatePublicSiteFeedback,
updatePrivateSiteFeedback
} = require('../controllers/siteFeedbackController')
const { doubleCsrfProtection } = require('../controllers/csrf-controller')

const router = express.Router()

Expand All @@ -17,7 +18,7 @@ router.get('/private', getPrivateSiteFeedbacks)
router.get('/public', getPublicSiteFeedbacks)

// POST a new feedback
router.post('/', createSiteFeedback)
router.post('/', doubleCsrfProtection, createSiteFeedback)

// DELETE a feedback
router.delete('/:id', deleteSiteFeedback)
Expand Down
9 changes: 9 additions & 0 deletions server/routes/csrf-routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

const express = require('express');
const { generateCsrfToken } = require('../controllers/csrf-controller');

const router = express.Router()

router.get("/generate", generateCsrfToken);

module.exports = router
9 changes: 9 additions & 0 deletions server/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ const certificate = fs.readFileSync('./security/cert.pem')

const googleOAuthRoutes = require('./routes/google-oauth-routes')

/* CSRF routes */
const csrfRoutes = require("./routes/csrf-routes");

const userRoutes = require('./routes/userRoutes')
const siteFeedbacks = require('./routes/SiteFeedbackRoutes')

Expand Down Expand Up @@ -82,6 +85,8 @@ app.use(deserializeToken);
const cookieSession = require('cookie-session');
const passport = require('passport');

const cookieParser = require('cookie-parser');

app.use(
cookieSession({
name: "cookie-session",
Expand All @@ -98,6 +103,10 @@ app.use(passport.session());
// Google oauth routes
app.use('/auth', googleOAuthRoutes)

// CSRF routes and cookie-parser middleware
app.use(cookieParser());
app.use("/csrf", csrfRoutes);

// routes
app.use('/api/users', userRoutes)
app.use('/api/orders', orderRoutes)
Expand Down

0 comments on commit 4bc0df9

Please sign in to comment.