O php
código abaixo permite que apenas a URL http://example1.com
tenha acesso à aplicação. Como posso permitir acesso apenas às quatro URLs abaixo em PHP?
http://example1.com
http://example2.com
http://example3.com
http://example4.com
<?php
error_reporting(0);
header('Access-Control-Allow-Origin: http://example1.com');
header('Access-Control-Allow-Methods: POST');
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
$allowedOrigin = 'http://example1.com'; // Your expected origin
if ($_SERVER['HTTP_ORIGIN'] !== $allowedOrigin) {
//echo "Access Denied.";
$return_arr = array("msg"=>"Access Denied");
echo json_encode($return_arr);
exit();
}
$validReferer = 'http://example1.com/'; // Change to your actual domain! Include trailing slash if the AJAX call comes from a subfolder
if (strpos($_SERVER['HTTP_REFERER'], $validReferer) !== 0) {
// echo "Access Denied (Invalid Referer).";
$return_arr = array("msg"=>"Access Denied");
echo json_encode($return_arr);
exit();
}
// begin insert records into database
?>
Antes de gerar o
Access-Control-Allow-Origin
cabeçalho, verifique se oOrigin
cabeçalho da solicitação é uma origem permitida. Isso é feito mais facilmente tendo um array de origens permitidas e usandoin_array
. Você também pode adotar abordagens mais complexas (por exemplo, usando uma expressão regular), mas tome cuidado para não ser mais permissivo do que o necessário.Se for, use esse valor na resposta.
Se a solicitação for uma solicitação OPTIONS (pré-voo), não realize nenhum processamento adicional. Apenas responda que não há problema em enviar a solicitação propriamente dita.
Uma abordagem básica para isso seria:
No entanto, existem muitas soluções pré-desenvolvidas que provavelmente são mais robustas do que esta, então você deve considerar uma delas. Principalmente se estiver usando qualquer tipo de framework.
Ignore o cabeçalho Referer. Ele não é útil.
Não vá direto para a inserção de dados em um banco de dados. O CORS só protege contra sites de terceiros que permitem que seus usuários acessem seu site (com quaisquer cookies e outros recursos que os usuários deles já tenham para o seu site). Ele não impede que as pessoas façam solicitações HTTP diretamente ao seu serviço web. Você está permitindo o cabeçalho de autorização, então verifique seu AuthN/AuthZ antes de inserir qualquer coisa em seu banco de dados.
Crie um array contendo todas as suas origens permitidas (você pode até mesmo manter isso em um banco de dados ou arquivo de configuração se precisar modificá-lo com frequência, para que seja mais configurável, e simplesmente carregue-o no seu array PHP conforme necessário). Em seguida, verifique se a origem de entrada corresponde a uma delas. Em caso afirmativo, adicione o
Access-Control-Allow-Origin
cabeçalho correspondente. Caso contrário, não exiba esse cabeçalho.Você realmente não precisa da resposta "negada" como tal - se for de fato uma solicitação CORS, o navegador cuidará disso e emitirá um erro CORS para o código JS se o
Access-Control-Allow-Origin
cabeçalho retornado não corresponder à origem ou se o cabeçalho estiver ausente.Observação: não tenho certeza do que você está tentando alcançar verificando também o cabeçalho REFERER — é fácil de falsificar e não tem nada a ver com CORS. Duvido que ajude você com qualquer objetivo que tenha em mente.