Why is this an issue?

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.

How to fix it in Core PHP

Code Examples

Noncompliant Code Example

header("Access-Control-Allow-Origin: *"); // Noncompliant

Compliant Solution

header("Access-Control-Allow-Origin: $trusteddomain");

How to fix it in Laravel

Code Examples

Noncompliant Code Example

response()->header('Access-Control-Allow-Origin', "*"); // Noncompliant

Compliant Solution

response()->header('Access-Control-Allow-Origin', $trusteddomain);

How to fix it in Symfony

Code Examples

Noncompliant Code Example

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

Compliant Solution

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);
}

Resources