php - 带有 PHP header 的跨域请求 header (CORS)

标签 php javascript xmlhttprequest cors

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

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

但我仍然收到错误:

Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers

我缺少什么吗?

最佳答案

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

/**
 *  An example CORS-compliant method.  It will allow any GET, POST, or OPTIONS requests from any
 *  origin.
 *
 *  In a production environment, you probably want to be more restrictive, but this gives you
 *  the general idea of what is involved.  For the nitty-gritty low-down, read:
 *
 *  - https://developer.mozilla.org/en/HTTP_access_control
 *  - https://fetch.spec.whatwg.org/#http-cors-protocol
 *
 */
function cors() {
    
    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }
    
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
        
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    
        exit(0);
    }
    
    echo "You have CORS!";
}

安全注意事项

Check the HTTP_ORIGIN header against a list of approved origins.

如果来源未被批准,那么您应该拒绝该请求。

请阅读规范。

TL;DR

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

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

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

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

标题安全

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

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

关于php - 带有 PHP header 的跨域请求 header (CORS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719276/

相关文章:

php - 如何查询多个变量以在 Codeigniter 的 View 中显示

php - 为php5.6安装sqlite

JavaScript 替换字符串

c# - 将正确的 header 值发送到从 Angular $http 到 asp.net webapi 的 Preflight 请求时出错

c# - 我应该使用哪个 header ? XMLHTTPRequest header 还是 SOAP header ?

php - 如何从以加号 (+) 开头的行创建段落

php - PHP解析/语法错误;以及如何解决它们

javascript - 谷歌组织结构图 : Modify node parent

javascript - 上一个完成后无法触发下一个功能

javascript - 使用 Chrome 扩展捕获并修改来自 Facebook 的 XHR 请求