Bird
Raised Fist0
Flaskframework~10 mins

CSRF protection in Flask - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - CSRF protection
User loads form page
↓
Server generates CSRF token
↓
Token embedded in form as hidden field
↓
User submits form with token
↓
Server checks token validity
↓
Process
↓
form data
This flow shows how a CSRF token is created, sent with the form, and checked on submission to protect against unauthorized requests.
Execution Sample
Flask
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from flask_wtf.csrf import CSRFProtect
from flask import Flask

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'

csrf = CSRFProtect(app)

class MyForm(FlaskForm):
    name = StringField('Name')
    submit = SubmitField('Submit')
This code sets up CSRF protection in Flask and creates a form that automatically includes a CSRF token.
Execution Table
StepActionCSRF Token GeneratedToken Sent in FormToken ReceivedToken Valid?Result
1User requests form pageToken123Token123 embedded in formN/AN/AForm displayed with token
2User fills form and submitsToken123Token123 sent with form dataToken123YesForm data processed
3User submits form without tokenToken123No token sentNoneNoRequest rejected
4User submits form with wrong tokenToken123WrongToken456 sentWrongToken456NoRequest rejected
💡 Execution stops when form submission is accepted or rejected based on token validity.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4
csrf_tokenNoneToken123Token123Token123Token123
form_token_receivedNoneNoneToken123NoneWrongToken456
token_validFalseN/ATrueFalseFalse
Key Moments - 2 Insights
Why does the server reject the form submission if the CSRF token is missing or wrong?
Because the server compares the received token with the one it generated (see execution_table rows 3 and 4). If they don't match, it means the request might be forged, so it rejects it to protect the user.
How does the CSRF token get into the form the user submits?
The token is generated by the server when the form page loads and embedded as a hidden field inside the form (see execution_table step 1). This way, when the user submits, the token is sent back automatically.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the token_valid value at Step 2?
ATrue
BFalse
CNone
DN/A
💡 Hint
Check the 'Token Valid?' column at Step 2 in the execution_table.
At which step does the server reject the request due to missing token?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look for the row where 'Token Received' is 'None' and 'Result' is 'Request rejected'.
If the token sent with the form was changed to 'Token123' at Step 4, what would happen?
ARequest rejected
BForm data processed
CForm redisplayed
DServer error
💡 Hint
Compare Step 2 and Step 4 token values and results in the execution_table.
Concept Snapshot
CSRF protection in Flask:
- Server generates a unique token per user session.
- Token is embedded in forms as hidden fields.
- On form submit, server checks token matches.
- If valid, process form; if not, reject request.
- Use Flask-WTF's CSRFProtect for easy setup.
Full Transcript
CSRF protection works by creating a secret token when the user loads a form. This token is hidden inside the form and sent back when the user submits. The server checks if the token matches what it created. If it matches, the form data is accepted. If not, the request is rejected to prevent unauthorized actions. Flask-WTF helps by automatically generating and checking these tokens in forms.

Practice

(1/5)
1. What is the main purpose of CSRF protection in a Flask web application?
easy
A. To prevent unauthorized commands from being transmitted from a user the website trusts
B. To speed up the loading time of web pages
C. To encrypt user passwords in the database
D. To improve the visual design of forms

Solution

  1. Step 1: Understand CSRF meaning

    CSRF stands for Cross-Site Request Forgery, which tricks users into submitting unwanted actions.
  2. Step 2: Identify CSRF protection goal

    Protection stops fake requests that appear to come from trusted users, preventing unauthorized actions.
  3. Final Answer:

    To prevent unauthorized commands from being transmitted from a user the website trusts -> Option A
  4. Quick Check:

    CSRF protection = prevent fake trusted requests [OK]
Hint: CSRF stops fake form submissions from trusted users [OK]
Common Mistakes:
  • Confusing CSRF with password encryption
  • Thinking CSRF improves page speed
  • Believing CSRF changes form appearance
2. Which of the following is the correct way to enable CSRF protection in a Flask app?
easy
A. app = Flask(__name__) app.secret_key = 'secret' csrf = CSRFProtect(app)
B. app = Flask(__name__) csrf = CSRFProtect() app.secret_key = 'secret'
C. app = Flask(__name__) csrf = CSRFProtect(app) app.secret_key = None
D. app = Flask(__name__) app.secret_key = None csrf = CSRFProtect(app)

Solution

  1. Step 1: Set secret key before CSRFProtect

    CSRF protection requires a secret key set on the Flask app for token generation.
  2. Step 2: Initialize CSRFProtect with app

    Passing the app instance to CSRFProtect enables protection on the app.
  3. Final Answer:

    app = Flask(__name__) app.secret_key = 'secret' csrf = CSRFProtect(app) -> Option A
  4. Quick Check:

    Secret key set + CSRFProtect(app) = correct setup [OK]
Hint: Set secret_key before CSRFProtect(app) call [OK]
Common Mistakes:
  • Not setting secret_key or setting it after CSRFProtect
  • Passing no app to CSRFProtect
  • Setting secret_key to None disables protection
3. Given this Flask form code snippet, what happens if the CSRF token is missing or invalid when submitting the form?
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

class MyForm(FlaskForm):
    name = StringField('Name')
    submit = SubmitField('Send')
medium
A. The form submission is accepted without any error
B. The form automatically regenerates a new CSRF token and retries
C. A CSRFError is raised and the request is rejected
D. The form data is saved but a warning is logged

Solution

  1. Step 1: Understand FlaskForm CSRF behavior

    FlaskForm automatically checks for a valid CSRF token on submission.
  2. Step 2: Effect of missing/invalid token

    If the token is missing or wrong, Flask-WTF raises a CSRFError and rejects the request.
  3. Final Answer:

    A CSRFError is raised and the request is rejected -> Option C
  4. Quick Check:

    Invalid CSRF token = CSRFError raised [OK]
Hint: Missing CSRF token causes error and blocks form [OK]
Common Mistakes:
  • Assuming form submits anyway without token
  • Thinking token regenerates automatically on failure
  • Believing data saves with just a warning
4. You added CSRFProtect to your Flask app but still get CSRF errors on form submission. Which of these is the most likely cause?
medium
A. You called csrf = CSRFProtect(app) before creating the Flask app
B. You set app.secret_key to a strong random value
C. You used FlaskForm instead of plain WTForms Form
D. You forgot to include {{ form.csrf_token }} inside your HTML form

Solution

  1. Step 1: Check CSRF token inclusion in form

    The CSRF token must be included in the HTML form using {{ form.csrf_token }} for validation.
  2. Step 2: Understand error cause

    If the token is missing in the form, the server rejects the submission with a CSRF error.
  3. Final Answer:

    You forgot to include {{ form.csrf_token }} inside your HTML form -> Option D
  4. Quick Check:

    Missing token in form = CSRF errors [OK]
Hint: Always add {{ form.csrf_token }} inside your form tag [OK]
Common Mistakes:
  • Assuming secret_key causes errors when set correctly
  • Thinking FlaskForm causes errors instead of helping
  • Initializing CSRFProtect before app creation causes syntax error, not CSRF error
5. You want to protect an API endpoint in Flask that accepts JSON POST requests from your frontend. Which approach correctly applies CSRF protection?
hard
A. Disable CSRF protection for JSON endpoints because tokens only work with HTML forms
B. Use CSRFProtect and require the frontend to send the CSRF token in a custom header, then validate it in Flask
C. Add {{ form.csrf_token }} in the JSON payload sent by the frontend
D. Use FlaskForm on the API endpoint without any token validation

Solution

  1. Step 1: Understand CSRF with JSON APIs

    CSRF tokens can protect JSON POST requests if the token is sent in headers and validated server-side.
  2. Step 2: Correct method to protect API

    Use CSRFProtect and require frontend to send token in a custom header (e.g., X-CSRFToken), then validate it in Flask.
  3. Final Answer:

    Use CSRFProtect and require the frontend to send the CSRF token in a custom header, then validate it in Flask -> Option B
  4. Quick Check:

    CSRF token in header + validation = secure JSON API [OK]
Hint: Send CSRF token in header for JSON API protection [OK]
Common Mistakes:
  • Thinking CSRF tokens only work with HTML forms
  • Putting CSRF token inside JSON body without validation
  • Using FlaskForm without token validation on APIs
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard