Having a permissive Cross-Origin Resource Sharing policy is security-sensitive. It has led in the past to the following vulnerabilities:
Same origin policy in browsers prevents, by default and for security-reasons, a javascript frontend to perform a cross-origin HTTP request to a resource that has a different origin (domain, protocol, or port) from its own. The requested target can append additional HTTP headers in response, called CORS, that act like directives for the browser and change the access control policy / relax the same origin policy.
Access-Control-Allow-Origin header should be set only for a trusted origin and for specific resources. Access-Control-Allow-Origin header. Prefer whitelisting domains over blacklisting or
allowing any domain (do not use * wildcard nor blindly return the Origin header content without any checks).
header("Access-Control-Allow-Origin: *"); // Noncompliant
header("Access-Control-Allow-Origin: $trusteddomain");
Access-Control-Allow-Origin header should be set only for a trusted origin and for specific resources. Access-Control-Allow-Origin header. Prefer whitelisting domains over blacklisting or
allowing any domain (do not use * wildcard nor blindly return the Origin header content without any checks).
response()->header('Access-Control-Allow-Origin', "*"); // Noncompliant
response()->header('Access-Control-Allow-Origin', $trusteddomain);
Access-Control-Allow-Origin header should be set only for a trusted origin and for specific resources. Access-Control-Allow-Origin header. Prefer whitelisting domains over blacklisting or
allowing any domain (do not use * wildcard nor blindly return the Origin header content without any checks).
use Symfony\Component\HttpFoundation\Response;
$response = new Response(
'Content',
Response::HTTP_OK,
['Access-Control-Allow-Origin' => '*'] // Noncompliant
);
$response->headers->set('Access-Control-Allow-Origin', '*'); // Noncompliant
User-controlled origin:
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
$origin = $request->headers->get('Origin');
$response->headers->set('Access-Control-Allow-Origin', $origin); // Noncompliant
use Symfony\Component\HttpFoundation\Response;
$response = new Response(
'Content',
Response::HTTP_OK,
['Access-Control-Allow-Origin' => $trusteddomain]
);
$response->headers->set('Access-Control-Allow-Origin', $trusteddomain);
User-controlled origin validated with an allow-list:
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
$origin = $request->headers->get('Origin');
if (in_array($origin, $trustedOrigins)) {
$response->headers->set('Access-Control-Allow-Origin', $origin);
}