禁用 Yii2 中单个操作的 CSRF 验证
Posted
技术标签:
【中文标题】禁用 Yii2 中单个操作的 CSRF 验证【英文标题】:Disable CSRF validation for individual actions in Yii2 【发布时间】:2015-04-16 02:31:00 【问题描述】:有没有办法为控制器的某些操作禁用 CSRF 验证,同时为其他操作启用它?
在我的例子中,我有几个可配置的 Action 类,它们旨在注入到控制器中。我无法将 csrf 验证令牌传递到 AJAX 请求中,因为我正在使用的是前端的外部(不是我制作的)WYSIWYG 插件。是的,我仍然可以使用这些操作禁用整个控制器的 csrf 验证,但它可能不安全。
【问题讨论】:
【参考方案1】:对于特定的控制器/操作,您可以像这样禁用 CSRF 验证:
use Yii;
...
Yii::$app->controller->enableCsrfValidation = false;
或者在控制器内部:
$this->enableCsrfValidation = false;
看看yii\web\Controller的$enableCsrfValidation属性。
更新:
这是一些规范。
如果您想为单个操作禁用 CSRF 验证,您需要在 beforeAction
事件处理程序中执行此操作,因为在操作运行之前会检查 CSRF 令牌(在 yii\web\Controller
的 beforeAction
中)。
/**
* @inheritdoc
*/
public function beforeAction($action)
if ($action->id == 'my-method')
$this->enableCsrfValidation = false;
return parent::beforeAction($action);
官方文档:
beforeAction()【讨论】:
这个参数的检查是在beforeAction中处理的,所以在action里面做这个是没用的。 @yujin1st 我实际上并没有提到具体放置它的位置,但是是的,它需要放在beforeAction
中。感谢您的评论,更新了答案。
但是我使用了你的代码,就像你用操作替换它一样
$action
应该已经包含了action id,在方法里面试试var_dump
,结果如何?
@Alex 感谢您的评论,更正了答案。顺便说一句,你也可以建议编辑。【参考方案2】:
把它放在你的控制器中,只需用你想禁用csrf
的任何操作替换索引。
public function beforeAction()
if ($this->action->id == 'index')
$this->enableCsrfValidation = false;
return true;
【讨论】:
为什么在控制器中使用长路由Yii::$app->controller->
使用$this
来禁用当前控制器操作..【参考方案3】:
对我来说这是有效的
public function beforeAction($action)
if($action->id == 'my-action')
Yii::$app->request->enableCsrfValidation = false;
return parent::beforeAction($action);
【讨论】:
需要使用 "==" no "="【参考方案4】:我试过了,效果很好。
转到特定的控制器并在顶部写下这个。
public $enableCsrfValidation = false;
【讨论】:
这会禁用控制器中所有操作的 CSRF 验证。 OP 询问个人行为。以上是关于禁用 Yii2 中单个操作的 CSRF 验证的主要内容,如果未能解决你的问题,请参考以下文章
在 ajax 提交时禁用 symfony 2 csrf 令牌保护
如何在 Laravel 中禁用 CSRF 令牌以及为啥我们必须禁用它?