comparison roundup/rest.py @ 7155:89a59e46b3af

improve REST interface security When using REST, we reflect the client's origin. If the wildcard '*' is used in allowed_api_origins all origins are allowed. When this is done, it also added an 'Access-Control-Allow-Credentials: true' header. This Credentials header should not be added if the site is matched only by '*'. This header should be provided only for explicit origins (e.g. https://example.org) not for the wildcard. This is now fixed for CORS preflight OPTIONS request as well as normal GET, PUT, DELETE, POST, PATCH and OPTIONS requests. A missing Access-Control-Allow-Credentials will prevent the tracker from being accessed using credentials. This prevents an unauthorized third party web site from using a user's credentials to access information in the tracker that is not publicly available. Added test for this specific case. In addition, allowed_api_origins can include explicit origins in addition to '*'. '*' must be first in the list. Also adapted numerous tests to work with these changes. Doc updates.
author John Rouillard <rouilj@ieee.org>
date Thu, 23 Feb 2023 12:01:33 -0500
parents 626ef84579a3
children 6f09103a6522
comparison
equal deleted inserted replaced
7154:f614176903d0 7155:89a59e46b3af
2199 self.client.setHeader( 2199 self.client.setHeader(
2200 "Access-Control-Allow-Origin", 2200 "Access-Control-Allow-Origin",
2201 self.client.request.headers.get("Origin") 2201 self.client.request.headers.get("Origin")
2202 ) 2202 )
2203 2203
2204 # allow credentials 2204 # Allow credentials if origin is acceptable.
2205 self.client.setHeader( 2205 #
2206 "Access-Control-Allow-Credentials", 2206 # If Access-Control-Allow-Credentials header not returned,
2207 "true" 2207 # but the client request is made with credentials
2208 ) 2208 # data will be sent but not made available to the
2209 # calling javascript in browser.
2210 # Prevents exposure of data to an invalid origin when
2211 # credentials are sent by client.
2212 #
2213 # If admin puts * first in allowed_api_origins
2214 # we do not allow credentials but do reflect the origin.
2215 # This allows anonymous access.
2216 if self.client.is_origin_header_ok(api=True, credentials=True):
2217 self.client.setHeader(
2218 "Access-Control-Allow-Credentials",
2219 "true"
2220 )
2221
2209 # set allow header in case of error. 405 handlers below should 2222 # set allow header in case of error. 405 handlers below should
2210 # replace it with a custom version as will OPTIONS handler 2223 # replace it with a custom version as will OPTIONS handler
2211 # doing CORS. 2224 # doing CORS.
2212 self.client.setHeader( 2225 self.client.setHeader(
2213 "Allow", 2226 "Allow",

Roundup Issue Tracker: http://roundup-tracker.org/