Skip to content

Commit 48eba40

Browse files
authored
Merge pull request #382 from FalkorDB/copilot/add-hsts-header
Add HSTS header to prevent MITM attacks
2 parents bfef44f + c2b3551 commit 48eba40

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

api/app_factory.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ async def dispatch(self, request: Request, call_next):
4343
return JSONResponse(status_code=403, content={"detail": "Forbidden"})
4444

4545
response = await call_next(request)
46+
47+
# Add HSTS header to prevent man-in-the-middle attacks
48+
# max-age=31536000: 1 year in seconds
49+
# includeSubDomains: apply to all subdomains
50+
# preload: eligible for browser HSTS preload lists
51+
hsts_value = "max-age=31536000; includeSubDomains; preload"
52+
response.headers["Strict-Transport-Security"] = hsts_value
53+
4654
return response
4755

4856

tests/test_hsts_header.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""
2+
Test for HSTS header presence in responses.
3+
"""
4+
import pytest
5+
from fastapi.testclient import TestClient
6+
from api.index import app
7+
8+
9+
class TestHSTSHeader:
10+
"""Test HSTS security header."""
11+
12+
@pytest.fixture
13+
def client(self):
14+
"""Create a test client."""
15+
return TestClient(app)
16+
17+
def test_hsts_header_present(self, client):
18+
"""Test that the HSTS header is present in responses."""
19+
# Make a request to the root endpoint
20+
response = client.get("/")
21+
22+
# Verify HSTS header is present
23+
assert "strict-transport-security" in response.headers
24+
25+
# Verify header value contains required directives
26+
hsts_header = response.headers["strict-transport-security"]
27+
assert "max-age=31536000" in hsts_header
28+
assert "includeSubDomains" in hsts_header
29+
assert "preload" in hsts_header
30+
31+
def test_hsts_header_on_api_endpoints(self, client):
32+
"""Test that the HSTS header is present on API endpoints."""
33+
# Test on graphs endpoint
34+
response = client.get("/graphs")
35+
36+
# Verify HSTS header is present
37+
assert "strict-transport-security" in response.headers
38+
39+
# Verify header value contains required directives
40+
hsts_header = response.headers["strict-transport-security"]
41+
assert "max-age=31536000" in hsts_header
42+
assert "includeSubDomains" in hsts_header
43+
assert "preload" in hsts_header

0 commit comments

Comments
 (0)