Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有动态cors头的API漏洞_Php_Security_Caching_Cors - Fatal编程技术网

Php 具有动态cors头的API漏洞

Php 具有动态cors头的API漏洞,php,security,caching,cors,Php,Security,Caching,Cors,我一直在阅读如何正确保护支持动态cors头的API。不确定我是否完全理解任何子域的通配符问题 if (preg_match('|\.?my-site.com$|', $_SERVER['SERVER_NAME'])) { header('Access-Control-Allow-Origin: *'); header('Vary: Origin,Accept-Encoding'); } (我的API支持HTTP和HTTPS,前面是Varnish) 问题 使用访问控制允许来源:与发出

我一直在阅读如何正确保护支持动态cors头的API。不确定我是否完全理解任何子域的通配符问题

if (preg_match('|\.?my-site.com$|', $_SERVER['SERVER_NAME'])) {
   header('Access-Control-Allow-Origin: *');
   header('Vary: Origin,Accept-Encoding');
}
(我的API支持HTTP和HTTPS,前面是Varnish)

问题
  • 使用
    访问控制允许来源:
    与发出请求的实际来源相比是否存在缺陷
  • 通过添加
    Vary:Origin,Accept Encoding
    ,我可以获得哪些安全好处?当我读到缓存中毒时,我读到了对它们的需求,但不能说我理解这里的含义
  • 你会在这里找到一个很酷的答案::
  • 让我们假设您拥有一个银行网站,它使用基于cookie的会话。编写
    Access Control Allow Origin:
    将允许任何网站使用用户的cookie,从而使用用户的会话,从其网站向您的银行网站运行Ajax请求。因此,他们可以访问用户在连接时可以访问的任何内容:-)

  • 我认为这与安全性无关,但以下是一个有趣的答案:
  • Vary:Accept Encoding
    基本上告诉服务器在编码相同时从缓存加载页面,并重新生成页面以进行另一种编码。下面是上面一页中的一段引文,它解释了一个有用的案例:

    想象两个客户端:一个没有压缩的旧浏览器,一个有压缩的现代浏览器。如果它们都请求相同的页面,则根据首先发送请求的人,压缩或未压缩版本将存储在CDN中。现在问题开始了:旧浏览器可以要求常规的“index.html”并获取缓存的压缩版本(随机垃圾数据),或者新浏览器可以获取缓存的未压缩版本并尝试“解压”。不管怎样,都是坏消息

    使用
    访问控制允许来源:
    与发出请求的实际来源相比是否存在缺陷

    问题中概述的这种情况的唯一缺点是,如果您希望在请求中包含凭据,那么如果
    访问控制允许源站
    值为
    *
    ,则不能。请参阅MDN HTTP访问控制(CORS)文章中的

    因此,您可能想做的是,让您的PHP代码获取
    Origin
    请求头的值,并在
    访问控制允许Origin
    值中回显该值:

    if(preg\u match(“| \.?my site.com$|“,$\u SERVER['SERVER\u NAME'])){
    标头(“访问控制允许源代码:{$\u服务器['HTTP_源代码']}”);
    标题('Vary:Origin,Accept Encoding');
    }
    
    不确定我是否完全理解任何子域的通配符问题

    允许来自任何来源的请求存在问题的唯一情况是,您的服务在intranet内或防火墙后运行


    请参见

    中的相关答案,但在我的例子中,我只为我自己域的子域设置了
    允许原点:
    。也可以利用此漏洞吗?编写
    允许来源:
    允许任何网站访问服务器的响应。如果您想将其限制在您的域和子域,请查看此页面:我知道,但只有当xhr请求来自我自己的域时,才会设置通配符,对吗(根据我发布的示例)?不,通配符允许任何网站:-)谁在第一个?我想问的是,如果一个请求来自其他网站​ my-site.com,则不会设置cors标题,浏览器也不会向请求的应用程序发送响应。不