@@ -10,31 +10,46 @@ import (
10
10
const (
11
11
Header_XFrameOptions = "X-Frame-Options"
12
12
Default_XFrameOptions = "SAMEORIGIN"
13
+ Force_XFrameOptions = ""
13
14
Header_ContentTypeOptions = "X-Content-Type-Options"
14
15
Default_ContentTypeOptions = "nosniff"
16
+ Force_ContentTypeOptions = "nosniff"
15
17
Header_XssProtection = "X-XSS-Protection"
16
18
Default_XssProtection = "1; mode=block"
19
+ Force_XssProtection = "1; mode=block"
17
20
Header_ReferrerPolicy = "Referrer-Policy"
18
21
Default_ReferrerPolicy = "strict-origin-when-cross-origin"
22
+ Force_ReferrerPolicy = ""
19
23
Header_StrictTransportSecurity = "Strict-Transport-Security"
20
24
Default_StrictTransportSecurity = "max-age=63072000; includeSubDomains; preload"
25
+ Force_StrictTransportSecurity = ""
21
26
Header_ContentSecurityPolicy = "Content-Security-Policy"
22
27
Default_ContentSecurityPolicy = ""
28
+ Force_ContentSecurityPolicy = ""
23
29
Header_ContentSecurityPolicyReportOnly = "Content-Security-Policy-Report-Only"
24
30
Default_ContentSecurityPolicyReportOnly = ""
31
+ Force_ContentSecurityPolicyReportOnly = ""
25
32
Header_CrossOriginOpenerPolicy = "Cross-Origin-Opener-Policy"
26
33
Default_CrossOriginOpenerPolicy = ""
34
+ Force_CrossOriginOpenerPolicy = ""
27
35
Header_CrossOriginEmbedderPolicy = "Cross-Origin-Embedder-Policy"
28
36
Default_CrossOriginEmbedderPolicy = ""
37
+ Force_CrossOriginEmbedderPolicy = ""
29
38
Header_CrossOriginResourcePolicy = "Cross-Origin-Resource-Policy"
30
39
Default_CrossOriginResourcePolicy = ""
40
+ Force_CrossOriginResourcePolicy = ""
31
41
Header_PermissionsPolicy = "Permissions-Policy"
32
42
Default_PermissionsPolicy = ""
43
+ Force_PermissionsPolicy = ""
33
44
)
34
45
35
46
// Config the plugin configuration.
36
47
type Config struct {
37
48
SanitizeExposingHeaders bool `json:"sanitizeExposingHeaders"`
49
+ DefaultHeaders ConfigHeaders `json:"defaultHeaders"`
50
+ ForceHeaders ConfigHeaders `json:"forceHeaders"`
51
+ }
52
+ type ConfigHeaders struct {
38
53
XFrameOptions string `json:"xframeOptions"`
39
54
ContentTypeOptions string `json:"contentTypeOptions"`
40
55
XssProtection string `json:"xssProtection"`
@@ -50,8 +65,7 @@ type Config struct {
50
65
51
66
// CreateConfig creates the DEFAULT plugin configuration - no access to config yet!
52
67
func CreateConfig () * Config {
53
- return & Config {
54
- SanitizeExposingHeaders : true ,
68
+ defaultHeaders := ConfigHeaders {
55
69
XFrameOptions : Default_XFrameOptions ,
56
70
ContentTypeOptions : Default_ContentTypeOptions ,
57
71
XssProtection : Default_XssProtection ,
@@ -63,6 +77,26 @@ func CreateConfig() *Config {
63
77
CrossOriginEmbedderPolicy : Default_CrossOriginEmbedderPolicy ,
64
78
CrossOriginResourcePolicy : Default_CrossOriginResourcePolicy ,
65
79
PermissionsPolicy : Default_PermissionsPolicy ,
80
+ }
81
+
82
+ forceHeaders := ConfigHeaders {
83
+ XFrameOptions : Force_XFrameOptions ,
84
+ ContentTypeOptions : Force_ContentTypeOptions ,
85
+ XssProtection : Force_XssProtection ,
86
+ ReferrerPolicy : Force_ReferrerPolicy ,
87
+ StrictTransportSecurity : Force_StrictTransportSecurity ,
88
+ ContentSecurityPolicy : Force_ContentSecurityPolicy ,
89
+ ContentSecurityPolicyReportOnly : Force_ContentSecurityPolicyReportOnly ,
90
+ CrossOriginOpenerPolicy : Force_CrossOriginOpenerPolicy ,
91
+ CrossOriginEmbedderPolicy : Force_CrossOriginEmbedderPolicy ,
92
+ CrossOriginResourcePolicy : Force_CrossOriginResourcePolicy ,
93
+ PermissionsPolicy : Force_PermissionsPolicy ,
94
+ }
95
+
96
+ return & Config {
97
+ SanitizeExposingHeaders : true ,
98
+ DefaultHeaders : defaultHeaders ,
99
+ ForceHeaders : forceHeaders ,
66
100
}
67
101
}
68
102
@@ -102,8 +136,8 @@ func (t *StandardSecurityPlugin) ServeHTTP(rw http.ResponseWriter, req *http.Req
102
136
103
137
if contentTypeIsOrStartsWith (contentType , "text/html" ) {
104
138
// text/html only
105
- handleHeader (headers , Header_XFrameOptions , t .Config .XFrameOptions )
106
- handleHeader (headers , Header_XssProtection , t .Config .XssProtection )
139
+ handleHeader (headers , Header_XFrameOptions , t .Config .DefaultHeaders . XFrameOptions , t . Config . ForceHeaders . XFrameOptions )
140
+ handleHeader (headers , Header_XssProtection , t .Config .DefaultHeaders . XssProtection , t . Config . ForceHeaders . XssProtection )
107
141
} else {
108
142
headers .Del (Header_XFrameOptions )
109
143
headers .Del (Header_XssProtection )
@@ -115,20 +149,20 @@ func (t *StandardSecurityPlugin) ServeHTTP(rw http.ResponseWriter, req *http.Req
115
149
contentTypeIsOrStartsWith (contentType , "text/javascript" ) ||
116
150
contentTypeIsOrStartsWith (contentType , "application/pdf" ) ||
117
151
contentTypeIsOrStartsWith (contentType , "image/svg+xml" ) {
118
- handleHeader (headers , Header_ContentSecurityPolicy , t .Config .ContentSecurityPolicy )
119
- handleHeader (headers , Header_ContentSecurityPolicyReportOnly , t .Config .ContentSecurityPolicyReportOnly )
152
+ handleHeader (headers , Header_ContentSecurityPolicy , t .Config .DefaultHeaders . ContentSecurityPolicy , t . Config . ForceHeaders . ContentSecurityPolicy )
153
+ handleHeader (headers , Header_ContentSecurityPolicyReportOnly , t .Config .DefaultHeaders . ContentSecurityPolicyReportOnly , t . Config . ForceHeaders . ContentSecurityPolicyReportOnly )
120
154
} else {
121
155
headers .Del (Header_ContentSecurityPolicy )
122
156
headers .Del (Header_ContentSecurityPolicyReportOnly )
123
157
}
124
158
125
- handleHeader (headers , Header_ContentTypeOptions , t .Config .ContentTypeOptions )
126
- handleHeader (headers , Header_ReferrerPolicy , t .Config .ReferrerPolicy )
127
- handleHeader (headers , Header_StrictTransportSecurity , t .Config .StrictTransportSecurity )
128
- handleHeader (headers , Header_CrossOriginOpenerPolicy , t .Config .CrossOriginOpenerPolicy )
129
- handleHeader (headers , Header_CrossOriginEmbedderPolicy , t .Config .CrossOriginEmbedderPolicy )
130
- handleHeader (headers , Header_CrossOriginResourcePolicy , t .Config .CrossOriginResourcePolicy )
131
- handleHeader (headers , Header_PermissionsPolicy , t .Config .PermissionsPolicy )
159
+ handleHeader (headers , Header_ContentTypeOptions , t .Config . DefaultHeaders . ContentTypeOptions , t . Config . ForceHeaders .ContentTypeOptions )
160
+ handleHeader (headers , Header_ReferrerPolicy , t .Config . DefaultHeaders . ReferrerPolicy , t . Config . ForceHeaders .ReferrerPolicy )
161
+ handleHeader (headers , Header_StrictTransportSecurity , t .Config . DefaultHeaders . StrictTransportSecurity , t . Config . ForceHeaders .StrictTransportSecurity )
162
+ handleHeader (headers , Header_CrossOriginOpenerPolicy , t .Config . DefaultHeaders . CrossOriginOpenerPolicy , t . Config . ForceHeaders .CrossOriginOpenerPolicy )
163
+ handleHeader (headers , Header_CrossOriginEmbedderPolicy , t .Config . DefaultHeaders . CrossOriginEmbedderPolicy , t . Config . ForceHeaders .CrossOriginEmbedderPolicy )
164
+ handleHeader (headers , Header_CrossOriginResourcePolicy , t .Config . DefaultHeaders . CrossOriginResourcePolicy , t . Config . ForceHeaders .CrossOriginResourcePolicy )
165
+ handleHeader (headers , Header_PermissionsPolicy , t .Config . DefaultHeaders . PermissionsPolicy , t . Config . ForceHeaders .PermissionsPolicy )
132
166
133
167
t .next .ServeHTTP (rw , req )
134
168
}
@@ -137,13 +171,14 @@ func contentTypeIsOrStartsWith(haystack string, match string) bool {
137
171
return haystack == match || strings .HasPrefix (haystack , match + ";" )
138
172
}
139
173
140
- func handleHeader (headers http.Header , headerName string , newValue string ) {
141
- if newValue == "" {
142
- return
143
- } else if newValue == "-" { // - means remove value
144
- headers .Del (headerName )
145
- } else {
146
- headers .Set (headerName , newValue )
174
+ func handleHeader (headers http.Header , headerName string , defaultValue string , forceValue string ) {
175
+ if forceValue != "" {
176
+ headers [headerName ] = []string {forceValue }
177
+ return
178
+ }
179
+
180
+ if defaultValue != "" && headers .Get (headerName ) == "" {
181
+ headers [headerName ]= []string {defaultValue }
147
182
}
148
183
}
149
184
0 commit comments