带有PHP头的跨源请求头(COR)

带有PHP头的跨源请求头(COR),php,javascript,xmlhttprequest,cors,Php,Javascript,Xmlhttprequest,Cors,我有一个简单的PHP脚本,我正在尝试跨域CORS请求: <?php header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Headers: *"); ... 访问控制允许标头不允许将*作为接受值,请参阅Mozilla文档 您应该发送接受的标题,而不是星号(第一个X-request-With,如错误所示) 更新: *现在接受的是访问控制允许标题 根据: 值*仅对没有凭据的请求(没有HTTP Cookie

我有一个简单的PHP脚本,我正在尝试跨域CORS请求:

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...

访问控制允许标头
不允许将
*
作为接受值,请参阅Mozilla文档

您应该发送接受的标题,而不是星号(第一个
X-request-With
,如错误所示)

更新:
*
现在接受的是
访问控制允许标题

根据:

*
仅对没有凭据的请求(没有HTTP Cookie或HTTP身份验证信息的请求)计为特殊通配符值。在具有凭据的请求中,它被视为文本头名称
*
,没有特殊语义。请注意,授权标头不能为通配符,始终需要显式列出


正确处理CORS请求有点复杂。这是一个响应更全面(正确)的函数

安全说明 当浏览器想要执行跨站点请求时,它首先通过对URL的“飞行前”请求确认这是可以的。通过允许CORS,您告诉浏览器来自此URL的响应可以与其他域共享

CORS不保护您的服务器。CORS试图通过告诉浏览器与其他域共享响应的限制来保护您的用户。通常这种共享是完全禁止的,所以CORS是在浏览器的正常安全策略上戳一个洞的一种方式。这些漏洞应该尽可能小,因此始终根据某种内部列表检查HTTP_源代码

这里有一些危险,特别是如果URL提供的数据通常受到保护。实际上,您允许源于其他服务器的浏览器内容读取(并可能操作)服务器上的数据

如果您打算使用CORS,请仔细阅读协议(它非常小),并尝试了解您正在做什么。代码示例中为此提供了一个参考URL

标题安全性 据观察,HTTP_ORIGIN头是不安全的,这是事实。事实上,所有HTTP头对于术语的不同含义都是不安全的。除非标头包含可验证的签名/hmac,或者整个对话通过TLS进行身份验证,否则标头只是“浏览器告诉我的东西”


在这种情况下,浏览器会说“来自域X的对象希望从该URL获得响应。可以吗?”CORS的要点是能够回答“是的,我允许这样做”。

我得到了相同的错误,并在后端脚本中使用以下PHP修复了它:

header('Access-Control-Allow-Origin: *');

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");

我只是设法让dropzone和其他插件使用这个修复程序(angularjs+php后端)

将其添加到upload.php或发送请求的位置(例如,如果您有upload.html,需要将文件附加到upload.php,然后复制并粘贴这4行)。
此外,如果您在chrome/mozilla中使用CORS插件/插件,请确保多次切换它们,以便启用CORS如果您想从PHP创建CORS服务,可以将此代码用作文件中处理请求的第一步:

// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}
else
{
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
    header("Access-Control-Allow-Origin: *");
}

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600");    // cache for 10 minutes

if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    //Just exit with 200 OK with the above headers for OPTIONS method
    exit(0);
}
//From here, handle the request as it is ok

如果我们不能正确理解CORS的功能,它可能会成为一个令人头痛的问题。我在PHP中使用它们,它们工作起来没有问题


互联网范围内的许多描述都没有提到,仅指定
访问控制允许来源是不够的。下面是一个对我有用的完整示例:

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
        header('Access-Control-Allow-Headers: token, Content-Type');
        header('Access-Control-Max-Age: 1728000');
        header('Content-Length: 0');
        header('Content-Type: text/plain');
        die();
    }

    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/json');

    $ret = [
        'result' => 'OK',
    ];
    print json_encode($ret);

当使用angular 4作为客户端,使用PHP作为服务器端时,这些代码对我来说非常有用

header("Access-Control-Allow-Origin: *");
这应该行得通

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");

将此代码添加到.htaccess

在标头中添加自定义身份验证密钥,如app_key、auth_key..等

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"

在Windows中,将此命令粘贴到run窗口以测试代码


chrome.exe--user data dir=“C:/chrome dev session”--禁用web安全性

请注意,将HTTP源代码值作为允许的源代码发送回将允许任何人向您发送带有cookie的请求,从而有可能从登录您的站点然后查看攻击者页面的用户那里窃取会话。您可以发送“*”(这将禁止Cookie,从而防止会话窃取),也可以发送您希望站点工作的特定域。同意。实际上,您可能不会允许任何旧域使用您的CORS服务,您会将其限制为您决定信任的某个集合。谢谢!我必须把这个答案加入书签。太糟糕了,我们不能将此标记为一个新的答案—唯一真正有效的答案!。。只需更改访问控制允许源代码:*访问控制允许源代码:{$\u服务器['HTTP_Origin']}通过使用
ACAC:true
无条件地允许任何源代码,您实际上是在将相同的源代码策略抛出窗口。从安全的角度来看,这个答案是一个糟糕的建议,应该被否决为遗忘。请解释为什么它不够,以及哪一个最简单的例子足够。不幸的是,我记不清了,我现在没有时间再次调查它,但据我所知,Web服务器/浏览器方面的一些基本假设使其无法工作。这是对我有效的最低限度的代码。如果已经在apache的virtul主机中发送了..那么只有这段代码有效..如果($\u SERVER['REQUEST\u METHOD']==='OPTIONS'){die();}基本上它在这里说的是足够了,只是如果请求方法是'OPTIONS'。禁用浏览器的web安全性,即使是暂时的,是2021年的一个糟糕的想法,看起来现在MDN文档接受了
*
。使用“*”通配符时要小心。永远不要打开它,除非那是你真正想要做的。至于测试你的angular应用程序,请指定,它将在更安全的情况下工作。这解决了我的问题-显然
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"