Php 具有动态cors头的API漏洞
我一直在阅读如何正确保护支持动态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) 问题 使用访问控制允许来源:与发出
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
,我可以获得哪些安全好处?当我读到缓存中毒时,我读到了对它们的需求,但不能说我理解这里的含义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标题,浏览器也不会向请求的应用程序发送响应。不