【问题标题】:Add multiple domains in x-frame-options on header with Laravel使用 Laravel 在标头的 x-frame-options 中添加多个域
【发布时间】:2018-11-01 06:58:27
【问题描述】:

我想在 X-Frame-Options 中添加多个域,因为我必须授权 facebook 和 messenger。

我尝试了很多东西,例如...

我创建了一个中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class FrameHeadersMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        $response->header('X-Frame-Options', 'ALLOW FROM https://www.messenger.com/');
        $response->header('X-Frame-Options', 'ALLOW FROM https://www.facebook.com/');

        return $response;
    }
}

但是只添加了facebook...

编辑:我使用 http 引用:

    <?php

    namespace App\Http\Middleware;

    use Closure;
    use Request;

    class FrameHeadersMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $response = $next($request);

            if(Request::server('HTTP_REFERER') === 'www.messenger.com'){
                $response->header('X-Frame-Options', 'ALLOW FROM https://www.messenger.com/');
            }

            if(Request::server('HTTP_REFERER') === 'www.facebook.com'){
                $response->header('X-Frame-Options', 'ALLOW FROM https://www.facebook.com/');
            }

            return $response;
        }
    }

【问题讨论】:

标签: php laravel-5 http-headers


【解决方案1】:

您不能同时拥有多个 X-Frame-Options 标头。

the specification:

2.3.2.3。 ALLOW-FROM 的使用设计模式和示例场景 参数

由于“ALLOW-FROM”字段只支持一个序列化来源,在
服务器希望允许多个资源框架的情况 它的内容,下面的设计模式可以满足这个需求:

  1. 想要在框架中呈现请求内容的页面 将其自己的原始信息提供给提供 要通过查询字符串参数框定的内容。

  2. 服务器验证主机名是否符合其条件,以便 页面允许被目标资源框住。这 例如,可能通过查找受信任的白名单来发生 允许构成页面的域名。例如, 对于 Facebook 的“Like”按钮,服务器可以检查以查看 提供的主机名与预期的主机名匹配 “喜欢”按钮。

  3. 服务器在“X-Frame-Options: ALLOW-FROM”中返回主机名 如果在第 2 步中满足适当的标准。

  4. 浏览器强制执行“X-Frame-Options: ALLOW-FROM”标头。

【讨论】:

  • 这里的解决方法是在中间件中执行类似(已编辑)if($_SERVER['HTTP_ORIGIN'] === 'www.messenger.com') { $response-&gt;header('X-Frame-Options', 'ALLOW FROM https://www.messenger.com/'); } 之类的操作。
  • @ceejayoz — 不。如果这行得通,那么你可以只做“SAME ORIGIN”。做我在回答中引用的内容。
  • 你的答案 - 它是实现#2和#3的代码。
  • @ceejayoz — 否。$request-&gt;getHttpHost() 将为您提供托管正在加载到 iframe 中的页面的站点的主机名。您需要检查带有&lt;iframe&gt;标签的页面的主机。
  • 啊!需要更多的咖啡。我现在看到了。 if($_SERVER['HTTP_ORIGIN'] 代替。
猜你喜欢
  • 1970-01-01
  • 2017-08-02
  • 2012-04-29
  • 2013-11-16
  • 2016-12-09
  • 2014-04-06
  • 2020-07-21
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多