3

我正在尝试使用PHP 框架 Yii拒绝 iframe调用我的网站。

我在“ index.php ”或“ protected/views/layouts/main.php ”的顶部添加了这一行

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

但是我仍然可以使用我网站的“src”属性创建一个 iframe!

我也在尝试:添加“ .htaccess ”:

Header always append X-Frame-Options DENY
4

5 回答 5

2

您可以通过配置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 标记不适用于这种情况。在我看来,如果您可以在服务器端正确设置标头,则永远不应该使用 http-equiv。

PHPheader()函数不起作用的原因是因为 Yii 的响应组件在准备要发送的响应之前重置所有标头。

于 2017-04-11T09:44:11.473 回答
1

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

<head>
      <meta http-equiv="X-FRAME-OPTIONS" content="DENY">
</head>
于 2013-07-16T08:48:56.000 回答
1

这是有关如何修改由 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');
于 2017-04-03T21:58:05.980 回答
0

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

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

它将添加<meta http-equiv="X-FRAME-OPTIONS" content="DENY">到 head 标签中。

有关更多详细信息,registerMetaTag请参见此处

于 2014-08-11T13:10:21.273 回答
0

我扩展了控制器

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);
}
于 2019-01-16T11:51:25.153 回答