Bird
Raised Fist0
Flaskframework~10 mins

Secure headers configuration in Flask - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Secure headers configuration
Start Flask app
↓
Receive HTTP request
↓
Process request in route
↓
Create HTTP response
↓
Add secure headers to response
↓
Send response to client
↓
Client receives response with secure headers
This flow shows how a Flask app adds secure headers to each HTTP response before sending it to the client.
Execution Sample
Flask
from flask import Flask, make_response
app = Flask(__name__)

@app.route('/')
def index():
    resp = make_response('Hello')
    resp.headers['X-Frame-Options'] = 'DENY'
    return resp
This code creates a Flask route that sends a response with a secure header to prevent clickjacking.
Execution Table
StepActionState BeforeState AfterOutput/Effect
1Start Flask appNo app runningApp running and listeningReady to receive requests
2Receive HTTP GET / requestWaiting for requestRequest receivedRoute '/' triggered
3Call index() route functionNo response createdResponse object createdResponse body: 'Hello'
4Add header 'X-Frame-Options: DENY'Response headers emptyResponse headers set with X-Frame-OptionsPrevents clickjacking
5Return responseResponse readyResponse sent to clientClient receives secure headers
6Client processes responseNo headersHeaders receivedBrowser blocks framing
💡 Response sent with secure headers, request cycle complete
Variable Tracker
VariableStartAfter Step 3After Step 4Final
respNoneResponse object with body 'Hello'Response object with header X-Frame-Options='DENY'Same response sent to client
Key Moments - 2 Insights
Why do we add headers after creating the response object?
Because headers belong to the response, we must create the response first (see Step 3) before adding headers (Step 4).
What does the 'X-Frame-Options: DENY' header do?
It tells browsers not to allow the page to be shown inside frames or iframes, preventing clickjacking attacks (Step 4 and 6).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the state of 'resp' after Step 3?
AResponse object with body 'Hello' and no headers
BResponse object with header X-Frame-Options set
CNo response object created yet
DResponse sent to client
💡 Hint
Check the 'State After' column in Step 3 in the execution table
At which step is the secure header 'X-Frame-Options' added to the response?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
Look for the action mentioning header addition in the execution table
If we forget to add the secure header, what changes in the execution table?
AStep 5 would not send response
BStep 3 would fail to create response
CStep 4 would show no header added, response headers remain empty
DClient would not receive any response
💡 Hint
Focus on the 'State After' column in Step 4 about headers
Concept Snapshot
Flask Secure Headers Configuration:
- Create response object with make_response()
- Add security headers like 'X-Frame-Options' to response.headers
- Return response to send headers to client
- Headers protect against attacks like clickjacking
- Always add headers before returning response
Full Transcript
This visual execution trace shows how a Flask app adds secure headers to HTTP responses. The app starts and listens for requests. When a request arrives at the '/' route, the index function creates a response object with the body 'Hello'. Then it adds the 'X-Frame-Options: DENY' header to prevent clickjacking. Finally, it returns the response to the client, which receives the secure headers and blocks framing. Variables like the response object change state as headers are added. Key points include adding headers after creating the response and understanding the security purpose of headers. The quiz questions check understanding of response state and header addition steps.

Practice

(1/5)
1. Which Flask feature is commonly used to add secure headers to every response?
easy
A. The @app.before_first_request decorator
B. The @app.route decorator
C. The @app.after_request decorator
D. The @app.teardown_request decorator

Solution

  1. Step 1: Understand Flask request lifecycle

    Flask allows modifying responses after the view function runs using @app.after_request.
  2. Step 2: Identify where headers are added

    Secure headers are added to the response object, which is accessible in @app.after_request.
  3. Final Answer:

    The @app.after_request decorator -> Option C
  4. Quick Check:

    Use @app.after_request to add headers [OK]
Hint: Add headers in @app.after_request for all responses [OK]
Common Mistakes:
  • Using @app.route which only defines routes
  • Trying to add headers in @app.before_first_request which runs once
  • Using @app.teardown_request which is for cleanup, not response modification
2. Which of the following is the correct syntax to add a Content-Security-Policy header in Flask?
easy
A. response.set_header('Content-Security-Policy', "default-src 'self'")
B. response.header['Content-Security-Policy'] = "default-src 'self'"
C. response.headers.add('Content-Security-Policy', "default-src 'self'")
D. response.headers['Content-Security-Policy'] = "default-src 'self'"

Solution

  1. Step 1: Recall Flask response header syntax

    Flask response headers are a dictionary-like object accessed via response.headers.
  2. Step 2: Assign header value correctly

    Use response.headers['Header-Name'] = value to set or overwrite headers.
  3. Final Answer:

    response.headers['Content-Security-Policy'] = "default-src 'self'" -> Option D
  4. Quick Check:

    Headers set by assignment to response.headers [OK]
Hint: Use response.headers['Name'] = value to set headers [OK]
Common Mistakes:
  • Using header instead of headers
  • Trying to call set_header which Flask response lacks
  • Using headers.add which is not a Flask method
3. Given this Flask code snippet, what will be the value of the X-Frame-Options header in the response?
from flask import Flask, Response
app = Flask(__name__)

@app.after_request
def add_headers(response: Response):
    response.headers['X-Frame-Options'] = 'DENY'
    return response

@app.route('/')
def home():
    return 'Hello'
medium
A. 'DENY'
B. 'SAMEORIGIN'
C. No X-Frame-Options header
D. 'ALLOW-FROM https://example.com'

Solution

  1. Step 1: Check header assignment in @app.after_request

    The function sets X-Frame-Options to 'DENY' on every response.
  2. Step 2: Confirm header presence in response

    Since the header is set unconditionally, the response will have X-Frame-Options: DENY.
  3. Final Answer:

    'DENY' -> Option A
  4. Quick Check:

    X-Frame-Options set to 'DENY' in after_request [OK]
Hint: Headers set in @app.after_request apply to all responses [OK]
Common Mistakes:
  • Assuming default header values without setting them
  • Confusing SAMEORIGIN with DENY
  • Thinking header is missing because not set in route
4. Identify the error in this Flask code that tries to add a Strict-Transport-Security header:
from flask import Flask
app = Flask(__name__)

@app.after_request
def secure_headers(response):
    response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
    return response

@app.route('/')
def index():
    return 'Welcome'
medium
A. The header name should be lowercase
B. No error; the code is correct
C. The header value string is missing quotes
D. The function must accept two parameters

Solution

  1. Step 1: Review header name and value syntax

    Header names are case-insensitive; using 'Strict-Transport-Security' is valid. The value is a valid string with quotes.
  2. Step 2: Check function signature and usage

    @app.after_request functions take one parameter (response) and return it. This matches the code.
  3. Final Answer:

    No error; the code is correct -> Option B
  4. Quick Check:

    Header added correctly in @app.after_request [OK]
Hint: Check function signature and header syntax carefully [OK]
Common Mistakes:
  • Thinking header names must be lowercase
  • Expecting two parameters in after_request function
  • Missing quotes around header value string
5. You want to add multiple secure headers in Flask, but only for HTTPS requests. Which is the best way to do this securely and efficiently?
hard
A. Use @app.after_request to check request.is_secure and add headers conditionally
B. Add headers in each route function only if request.scheme == 'https'
C. Set headers globally without checking protocol, assuming HTTPS everywhere
D. Use @app.before_request to add headers before response is created

Solution

  1. Step 1: Understand when headers should be added

    Secure headers like Strict-Transport-Security should only be sent over HTTPS to avoid security risks.
  2. Step 2: Choose the best place to add headers conditionally

    @app.after_request runs after response creation and can access request.is_secure to conditionally add headers efficiently for all routes.
  3. Step 3: Evaluate other options

    Adding headers in each route duplicates code; setting headers globally without checking protocol risks sending them over HTTP; @app.before_request cannot modify response headers.
  4. Final Answer:

    Use @app.after_request to check request.is_secure and add headers conditionally -> Option A
  5. Quick Check:

    Conditional header addition in @app.after_request is best [OK]
Hint: Check request.is_secure in @app.after_request [OK]
Common Mistakes:
  • Adding headers in each route causing repetition
  • Sending secure headers over HTTP by default
  • Trying to set headers in @app.before_request which can't modify response
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