Trusted host middleware helps your app accept requests only from safe website addresses. It blocks requests from unknown or harmful sources.
Trusted host middleware in FastAPI
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
FastAPI
from fastapi import FastAPI from starlette.middleware.trustedhost import TrustedHostMiddleware app = FastAPI() app.add_middleware( TrustedHostMiddleware, allowed_hosts=["example.com", "www.example.com"] )
The allowed_hosts list contains the hostnames your app trusts.
Use "*" to allow all hosts, but this disables protection.
Examples
myapp.com are accepted.FastAPI
app.add_middleware(
TrustedHostMiddleware,
allowed_hosts=["myapp.com"]
)FastAPI
app.add_middleware(
TrustedHostMiddleware,
allowed_hosts=["localhost", "127.0.0.1"]
)FastAPI
app.add_middleware(
TrustedHostMiddleware,
allowed_hosts=["*"]
)Sample Program
This FastAPI app only accepts requests where the host header is "example.com" or "www.example.com". Other hosts get blocked.
FastAPI
from fastapi import FastAPI from starlette.middleware.trustedhost import TrustedHostMiddleware from fastapi.responses import PlainTextResponse app = FastAPI() app.add_middleware( TrustedHostMiddleware, allowed_hosts=["example.com", "www.example.com"] ) @app.get("/") async def read_root(): return PlainTextResponse("Hello from trusted host!")
Important Notes
TrustedHostMiddleware returns a 400 error if the host is not allowed.
Make sure to include all domain variants your app uses (with and without www).
Use this middleware early in your middleware stack for best protection.
Summary
Trusted host middleware blocks requests from unknown hosts.
Configure it with a list of allowed hostnames.
It helps protect your app from host header attacks.
Practice
1. What is the main purpose of the
TrustedHostMiddleware in FastAPI?easy
Solution
Step 1: Understand middleware role
TheTrustedHostMiddlewareis designed to filter incoming requests based on their host header.Step 2: Identify its security purpose
It blocks requests from hosts not explicitly allowed to protect against host header attacks.Final Answer:
To block requests from hosts not in the allowed list -> Option AQuick Check:
TrustedHostMiddleware blocks unknown hosts = D [OK]
Hint: Remember: Trusted hosts means allowed hosts only [OK]
Common Mistakes:
- Confusing it with authentication middleware
- Thinking it speeds up app performance
- Assuming it manages database connections
2. Which of the following is the correct way to add
TrustedHostMiddleware to a FastAPI app?easy
Solution
Step 1: Recall FastAPI middleware syntax
FastAPI usesapp.add_middleware()with the middleware class and keyword arguments.Step 2: Check correct argument name
The correct argument for allowed hosts isallowed_hosts, nothostsorallowed.Final Answer:
app.add_middleware(TrustedHostMiddleware, allowed_hosts=['example.com']) -> Option BQuick Check:
Use add_middleware with allowed_hosts = C [OK]
Hint: Use add_middleware and allowed_hosts keyword [OK]
Common Mistakes:
- Using wrong method like app.use()
- Passing 'hosts' instead of 'allowed_hosts'
- Incorrect argument names like 'allowed'
3. Given this FastAPI app code snippet, what will happen if a request comes from host 'malicious.com'?
from fastapi import FastAPI
from starlette.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(TrustedHostMiddleware, allowed_hosts=['example.com', 'localhost'])
@app.get('/')
def read_root():
return {'message': 'Hello World'}medium
Solution
Step 1: Check allowed hosts list
The allowed hosts are 'example.com' and 'localhost'. 'malicious.com' is not in this list.Step 2: Understand middleware behavior on unknown hosts
TrustedHostMiddleware blocks requests from hosts not in the allowed list by returning a 400 error.Final Answer:
The request will be blocked with a 400 Bad Request error -> Option DQuick Check:
Unknown host causes 400 error = A [OK]
Hint: Requests from hosts not allowed get 400 error [OK]
Common Mistakes:
- Assuming the request passes through
- Thinking the app crashes on unknown hosts
- Believing the request is redirected automatically
4. Identify the error in this FastAPI app setup using TrustedHostMiddleware:
from fastapi import FastAPI
from starlette.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(TrustedHostMiddleware, allowed_hosts='example.com')
@app.get('/')
def home():
return {'msg': 'Welcome'}medium
Solution
Step 1: Check allowed_hosts argument type
Theallowed_hostsparameter expects a list of strings, but a single string was given.Step 2: Understand impact of wrong type
Passing a string instead of a list will cause the middleware to treat each character as a host, leading to incorrect behavior or errors.Final Answer:
allowed_hosts should be a list, not a string -> Option CQuick Check:
allowed_hosts must be list = A [OK]
Hint: allowed_hosts always needs a list, not a string [OK]
Common Mistakes:
- Passing a single string instead of list
- Thinking route functions must be async
- Assuming import is incorrect without error
5. You want to allow requests from any subdomain of
example.com and also from localhost. Which allowed_hosts list correctly configures TrustedHostMiddleware for this?hard
Solution
Step 1: Understand wildcard usage in allowed_hosts
TrustedHostMiddleware supports wildcards like*.example.comto allow all subdomains.Step 2: Check each option for correct wildcard syntax
['*.example.com', 'localhost'] uses'*.example.com'which correctly matches all subdomains; others use incorrect patterns.Final Answer:
['*.example.com', 'localhost'] -> Option AQuick Check:
Use '*.example.com' for subdomains = B [OK]
Hint: Use '*.domain.com' to allow all subdomains [OK]
Common Mistakes:
- Using 'example.com/*' which is invalid
- Using '*example.com' missing dot after *
- Not using wildcard for subdomains
