CSRF protection stops bad websites from tricking your site into doing things you don't want. It keeps your users safe.
CSRF protection in Express
Start learning this pattern below
Jump into concepts and practice - no test required
import csrf from 'csurf'; import cookieParser from 'cookie-parser'; const csrfProtection = csrf({ cookie: true }); app.use(cookieParser()); app.use(csrfProtection); app.get('/form', (req, res) => { res.send(`<form action='/process' method='POST'> <input type='hidden' name='_csrf' value='${req.csrfToken()}' /> <button type='submit'>Submit</button> </form>`); }); app.post('/process', (req, res) => { res.send('Data is processed safely.'); });
The csurf middleware adds a secret token to each user's cookie.
You must include the token in your forms as a hidden input named _csrf.
const csrfProtection = csrf({ cookie: true });app.use(csrfProtection);
res.send(`<input type='hidden' name='_csrf' value='${req.csrfToken()}' />`);This Express app uses the csurf middleware to protect a form from CSRF attacks. The token is stored in a cookie and added to the form as a hidden input. When the form is submitted, the server checks the token before processing.
import express from 'express'; import csrf from 'csurf'; import cookieParser from 'cookie-parser'; const app = express(); const port = 3000; app.use(cookieParser()); app.use(express.urlencoded({ extended: false })); const csrfProtection = csrf({ cookie: true }); app.get('/form', csrfProtection, (req, res) => { res.send(` <h1>Submit Form</h1> <form action='/process' method='POST'> <input type='hidden' name='_csrf' value='${req.csrfToken()}' /> <button type='submit'>Submit</button> </form> `); }); app.post('/process', csrfProtection, (req, res) => { res.send('Data is processed safely.'); }); app.listen(port, () => { console.log(`Server running on http://localhost:${port}`); });
Always use cookie-parser before csurf if you use cookie-based tokens.
If the CSRF token is missing or wrong, the server will reject the request with an error.
Remember to include the CSRF token in every form that changes data.
CSRF protection stops unwanted actions from other sites.
Use the csurf middleware with cookies or sessions.
Include the CSRF token in your forms as a hidden field.
Practice
Solution
Step 1: Understand CSRF meaning
CSRF stands for Cross-Site Request Forgery, which tricks users into submitting unwanted actions.Step 2: Identify CSRF protection goal
Protection stops other sites from sending commands on behalf of a user without permission.Final Answer:
To prevent unauthorized commands from being sent from other websites -> Option AQuick Check:
CSRF protection = prevent unauthorized commands [OK]
- Confusing CSRF with password encryption
- Thinking it speeds up server
- Believing it logs user activity
csurf package?Solution
Step 1: Recall csurf usage
Thecsurfmiddleware is used ascsurf({ cookie: true })to enable cookie-based CSRF tokens.Step 2: Check options correctness
Options B, C, and D use wrong function names or invalid options.Final Answer:
app.use(csurf({ cookie: true })) -> Option AQuick Check:
Correct csurf syntax = app.use(csurf({ cookie: true })) [OK]
- Using wrong function name like csrf()
- Missing the cookie option
- Passing invalid options
app.post('/submit', csurf({ cookie: true }), (req, res) => {
res.send('Form submitted');
});Solution
Step 1: Understand csurf error handling
If the CSRF token is missing or invalid, csurf middleware triggers an error with status 403 Forbidden.Step 2: Check route behavior
The route handler is not called; instead, Express sends a 403 error response.Final Answer:
The server throws a 403 Forbidden error -> Option CQuick Check:
Invalid CSRF token = 403 Forbidden error [OK]
- Assuming form submits anyway
- Thinking server redirects automatically
- Believing server crashes
csurf middleware but your form keeps failing CSRF validation. Which of these is the most likely cause?Solution
Step 1: Check form token inclusion
CSRF protection requires the token to be sent with the form, usually as a hidden input field.Step 2: Evaluate other options
While cookie-parser is needed if using cookies, the most common cause is missing token in the form.Final Answer:
You forgot to include the CSRF token in the form as a hidden input -> Option DQuick Check:
Missing token in form = validation fails [OK]
- Ignoring token in form fields
- Misordering middleware without reason
- Assuming cookie-parser always required
csurf with cookie-based tokens and render the token in a form. Which code snippet correctly sets up the middleware and passes the token to the template?Solution
Step 1: Setup csurf with cookie option
Usecsurf({ cookie: true })to enable cookie-based CSRF tokens.Step 2: Call
To get the token string, callreq.csrfToken()as a functionreq.csrfToken(), not just reference the function.Step 3: Pass token to template
Pass the token ascsrfTokenin the render call for the form to use.Final Answer:
app.use(csurf({ cookie: true })); app.get('/form', (req, res) => { res.render('form', { csrfToken: req.csrfToken() }); }); -> Option BQuick Check:
Correct csurf setup + token call = app.use(csurf({ cookie: true })); app.get('/form', (req, res) => { res.render('form', { csrfToken: req.csrfToken() }); }); [OK]
- Not calling req.csrfToken() as a function
- Using cookie: false when cookies are needed
- Passing function reference instead of token string
