File tree Expand file tree Collapse file tree 3 files changed +24
-4
lines changed Expand file tree Collapse file tree 3 files changed +24
-4
lines changed Original file line number Diff line number Diff line change @@ -171,7 +171,7 @@ def test_content_security_policy(self):
171
171
self .assertStatus (200 )
172
172
self .assertHeaderItemValue (
173
173
'Content-Security-Policy' ,
174
- "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; img-src 'self' data:; " ,
174
+ "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; img-src 'self' data:" ,
175
175
)
176
176
177
177
def test_strict_transport_security (self ):
Original file line number Diff line number Diff line change @@ -110,7 +110,12 @@ def default(o):
110
110
@cherrypy .tools .enrich_session ()
111
111
@cherrypy .tools .proxy (local = None , remote = 'X-Real-IP' )
112
112
@cherrypy .tools .secure_headers (
113
- csp = "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; img-src 'self' data:;"
113
+ csp = {
114
+ "default-src" : "'self'" ,
115
+ "style-src" : ("'self'" , "'unsafe-inline'" ),
116
+ "script-src" : ("'self'" , "'unsafe-inline'" ),
117
+ "img-src" : ("'self'" , "data:" ),
118
+ }
114
119
)
115
120
class Root (LocationsPage ):
116
121
def __init__ (self ):
Original file line number Diff line number Diff line change 22
22
# Define the logger
23
23
logger = logging .getLogger (__name__ )
24
24
25
+ DEFAULT_CSP = {
26
+ 'default-src' : 'self' ,
27
+ 'style-src' : ('self' , 'unsafe-inline' ),
28
+ 'script-src' : ('self' 'unsafe-inline' ),
29
+ }
30
+
25
31
#
26
32
# Patch Morsel prior to 3.8
27
33
# Allow SameSite attribute to be define on the cookie.
30
36
http .cookies .Morsel ._reserved ['samesite' ] = 'SameSite'
31
37
32
38
39
+ def _build_csp (csp ):
40
+ if isinstance (csp , dict ):
41
+ return "; " .join (
42
+ f"{ directive } { ' ' .join (sources ) if isinstance (sources , (list ,tuple )) else str (sources )} "
43
+ for directive , sources in csp .items ()
44
+ )
45
+ return str (csp )
46
+
47
+
33
48
def set_headers (
34
49
xfo = 'DENY' ,
35
50
no_cache = True ,
36
51
referrer = 'same-origin' ,
37
52
nosniff = True ,
38
53
xxp = '1; mode=block' ,
39
- csp = "default-src 'self'" ,
54
+ csp = DEFAULT_CSP ,
40
55
):
41
56
"""
42
57
This tool provide CSRF mitigation.
@@ -98,7 +113,7 @@ def set_headers(
98
113
99
114
# Add Content-Security-Policy
100
115
if csp :
101
- response .headers ['Content-Security-Policy' ] = csp
116
+ response .headers ['Content-Security-Policy' ] = _build_csp ( csp )
102
117
103
118
# Add Strict-Transport-Security to force https use.
104
119
if https :
You can’t perform that action at this time.
0 commit comments