我如何在PHP Yii框架中发送带有X-Frame-Options DENY的报头?

h7appiyu  于 2022-11-09  发布在  PHP
关注(0)|答案(5)|浏览(150)

我试图拒绝iframe调用我的网站与PHP框架Yii
我在“index.php”的顶部或“protected/views/layouts/main.php”中添加了这一行

<?php header("X-Frame-Options: DENY") ?>

但我仍然有可能创建一个iframe与'src'属性我的网站!
我也在努力:在“.htaccess”中添加:

Header always append X-Frame-Options DENY
n6lpvg4x

n6lpvg4x1#

您可以通过配置应用程序的response组件并在beforeSend事件中添加自定义头文件来实现此目的,例如:

return [
    ...
    'components' => [
        ...
        'response' => [
            'on beforeSend' => function($event) {
                $event->sender->headers->add('X-Frame-Options', 'DENY');
            },
        ],
        ...
    ],
];

这将为所有响应添加头。这可能不合适,在这种情况下,您可以在从操作返回之前使用\Yii::$app->response->headers->add($name, $value);,或者在控制器的afterAction()方法中使用。
在我看来,如果你能在服务器端正确地设置头文件,那么就永远不要使用http-equiv。
PHP的header()函数不起作用的原因是Yii的响应组件在准备发送响应之前重置了所有的头。

pengsaosao

pengsaosao2#

我通过在页面的头部添加 meta数据来解决:

<head>
      <meta http-equiv="X-FRAME-OPTIONS" content="DENY">
</head>
biswetbf

biswetbf3#

这里是关于如何修改YII框架(v2)发送的头的文档
http://www.yiiframework.com/doc-2.0/guide-runtime-responses.html#http-headers
HTTP标头
您可以通过在响应组件中操作标头集合来发送HTTP标头。例如,

$headers = Yii::$app->response->headers;

// add a Pragma header. Existing Pragma headers will NOT be overwritten.

    $headers->add('Pragma', 'no-cache');

// set a Pragma header. Any existing Pragma headers will be discarded.

    $headers->set('Pragma', 'no-cache');

// remove Pragma header(s) and return the removed Pragma header values in an array

    $values = $headers->remove('Pragma');
u3r8eeie

u3r8eeie4#

在YII风格中,我们可以使用registerMetaTag。在视图或布局或控制器中添加以下代码。

<?php Yii::app()->clientScript->registerMetaTag('DENY', null, null, array('http-equiv'=>'X-FRAME-OPTIONS')); ?>

它将在head标签中添加<meta http-equiv="X-FRAME-OPTIONS" content="DENY">
有关registerMetaTag的更多详细信息,请参阅此处。

1qczuiv0

1qczuiv05#

我扩展了控制器

protected function beforeAction($action)
{
    /**
     * Clickjacking protection for Yii1
     */
    if (version_compare(\Yii::getVersion(), '2.0.0', '<')) {
        header('X-Frame-Options: SAMEORIGIN');
    }
    return parent::beforeAction($action);
}

protected function afterAction($action)
{
    /**
     * Clickjacking protection for Yii2
     * https://stackoverflow.com/a/43342321/5546916
     */
    if (version_compare(\Yii::getVersion(), '2.0.0', '>=')) {
        \Yii::app()->response->headers->add('X-Frame-Options', 'SAMEORIGIN');
    }
    return parent::afterAction($action);
}

相关问题