@@ -160,6 +160,26 @@ public void isSameOrigin() {
160
160
assertFalse (checkSameOrigin ("[::1]" , 8080 , "http://[2001:0db8:0000:85a3:0000:0000:ac1f:8001]:8080" ));
161
161
}
162
162
163
+ @ Test // SPR-16262
164
+ public void isSameOriginWithXForwardedHeaders () {
165
+ assertTrue (checkSameOriginWithXForwardedHeaders ("mydomain1.com" , -1 , "https" , null , -1 , "https://mydomain1.com" ));
166
+ assertTrue (checkSameOriginWithXForwardedHeaders ("mydomain1.com" , 123 , "https" , null , -1 , "https://mydomain1.com" ));
167
+ assertTrue (checkSameOriginWithXForwardedHeaders ("mydomain1.com" , -1 , "https" , "mydomain2.com" , -1 , "https://mydomain2.com" ));
168
+ assertTrue (checkSameOriginWithXForwardedHeaders ("mydomain1.com" , 123 , "https" , "mydomain2.com" , -1 , "https://mydomain2.com" ));
169
+ assertTrue (checkSameOriginWithXForwardedHeaders ("mydomain1.com" , -1 , "https" , "mydomain2.com" , 456 , "https://mydomain2.com:456" ));
170
+ assertTrue (checkSameOriginWithXForwardedHeaders ("mydomain1.com" , 123 , "https" , "mydomain2.com" , 456 , "https://mydomain2.com:456" ));
171
+ }
172
+
173
+ @ Test // SPR-16262
174
+ public void isSameOriginWithForwardedHeader () {
175
+ assertTrue (checkSameOriginWithForwardedHeader ("mydomain1.com" , -1 , "proto=https" , "https://mydomain1.com" ));
176
+ assertTrue (checkSameOriginWithForwardedHeader ("mydomain1.com" , 123 , "proto=https" , "https://mydomain1.com" ));
177
+ assertTrue (checkSameOriginWithForwardedHeader ("mydomain1.com" , -1 , "proto=https; host=mydomain2.com" , "https://mydomain2.com" ));
178
+ assertTrue (checkSameOriginWithForwardedHeader ("mydomain1.com" , 123 , "proto=https; host=mydomain2.com" , "https://mydomain2.com" ));
179
+ assertTrue (checkSameOriginWithForwardedHeader ("mydomain1.com" , -1 , "proto=https; host=mydomain2.com:456" , "https://mydomain2.com:456" ));
180
+ assertTrue (checkSameOriginWithForwardedHeader ("mydomain1.com" , 123 , "proto=https; host=mydomain2.com:456" , "https://mydomain2.com:456" ));
181
+ }
182
+
163
183
164
184
private boolean checkValidOrigin (String serverName , int port , String originHeader , List <String > allowed ) {
165
185
MockHttpServletRequest servletRequest = new MockHttpServletRequest ();
@@ -183,4 +203,36 @@ private boolean checkSameOrigin(String serverName, int port, String originHeader
183
203
return WebUtils .isSameOrigin (request );
184
204
}
185
205
206
+ private boolean checkSameOriginWithXForwardedHeaders (String serverName , int port , String forwardedProto , String forwardedHost , int forwardedPort , String originHeader ) {
207
+ MockHttpServletRequest servletRequest = new MockHttpServletRequest ();
208
+ ServerHttpRequest request = new ServletServerHttpRequest (servletRequest );
209
+ servletRequest .setServerName (serverName );
210
+ if (port != -1 ) {
211
+ servletRequest .setServerPort (port );
212
+ }
213
+ if (forwardedProto != null ) {
214
+ request .getHeaders ().set ("X-Forwarded-Proto" , forwardedProto );
215
+ }
216
+ if (forwardedHost != null ) {
217
+ request .getHeaders ().set ("X-Forwarded-Host" , forwardedHost );
218
+ }
219
+ if (forwardedPort != -1 ) {
220
+ request .getHeaders ().set ("X-Forwarded-Port" , String .valueOf (forwardedPort ));
221
+ }
222
+ request .getHeaders ().set (HttpHeaders .ORIGIN , originHeader );
223
+ return WebUtils .isSameOrigin (request );
224
+ }
225
+
226
+ private boolean checkSameOriginWithForwardedHeader (String serverName , int port , String forwardedHeader , String originHeader ) {
227
+ MockHttpServletRequest servletRequest = new MockHttpServletRequest ();
228
+ ServerHttpRequest request = new ServletServerHttpRequest (servletRequest );
229
+ servletRequest .setServerName (serverName );
230
+ if (port != -1 ) {
231
+ servletRequest .setServerPort (port );
232
+ }
233
+ request .getHeaders ().set ("Forwarded" , forwardedHeader );
234
+ request .getHeaders ().set (HttpHeaders .ORIGIN , originHeader );
235
+ return WebUtils .isSameOrigin (request );
236
+ }
237
+
186
238
}
0 commit comments