最近在拿 yii 2.0 开发ajax提交,在 post 请求接口时,提示数据无法验证,于是查询 yii 错误日志,发现错误为

exception ‘yiiwebBadRequestHttpException’ with message ‘Unable to verify your data submission

于是查看源代码,yii 2.0 在 我们继承的顶级 controller 中,有下列属性

/**
* @var boolean whether to enable CSRF validation for the actions in this controller.
* CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
*/
public $enableCsrfValidation = true;

106 行的 beforeAction 内,对他做了处理

``` public function beforeAction($action) { if (parent::beforeAction($action)) { if ($this->enableCsrfValidation && Yii::$app->getErrorHandler()->exception === null && !Yii::$app->getRequest()->validateCsrfToken()) { throw new BadRequestHttpException(Yii::t('yii', 'Unable to verify your data submission.')); } return true; } else { return false; } }

```

于是找到错误原因:

yii 2.0 内,对 CSRF 攻击做了处理,会对 post 提交的数据做 token 验证,而微信 post 到我们服务器的代码中,没有带上这个 token ,所以会验证失败

解决方法:

1、在我们的控制器里面,加上这行属性,设置为 false

public $enableCsrfValidation = false;

你还可以直接修改顶层控制器的 $enableCsrfValidation ,但是不推荐这样做!

2、关于如何在单独的action中关闭Csrf验证

由于Yii2 Controller Csrf验证是在beforeAction中完成的,所以在action中指定
$this->enableCsrfValidation = false;
不能实现局部关闭Csrf。

如何实现

新建一个Behavior

<?php
use Yii;
use yii\base\ActionEvent;
use yii\base\Behavior;
use yii\web\Controller; class NoCsrf extends Behavior
{
public $actions = [];
public $controller;
public function events()
{
return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
}
public function beforeAction($event)
{
$action = $event->action->id;
if(in_array($action, $this->actions)){
$this->controller->enableCsrfValidation = false;
}
}
}

然后在Controller中添加Behavior

?php

    public function behaviors()
{
return [
'csrf' => [
'class' => NoCsrf::className(),
'controller' => $this,
'actions' => [
'action-name'
]
]
];
}

这样就实现了在action中关闭Csrf而不是在整个Controller中关闭。

yii 2 局部关闭 CSRF 拦截的更多相关文章

  1. yii2框架-yii2局部关闭(开启)csrf的验证

    (1)全局使用,我们直接在配置文件中设置enableCookieValidation为true request => [ 'enableCookieValidation' => true, ...

  2. 解决Django+Vue前后端分离的跨域问题及关闭csrf验证

      前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道   在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...

  3. CSRF拦截

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 事实上 ...

  4. laravel 关闭 csrf 验证 TokenMismatchException

    csrf验证失败 注释掉kernel.php 的 csrf 行代码

  5. Laravel 框架指定路由关闭 csrf

    修改 app\Http\Middleware\VerifyCsrfToken.php 内容: <?php namespace App\Http\Middleware; use Closure; ...

  6. Django用ajax发送post请求时csrf拦截的解决方案

    把下面的代码写在模版文件中就可以了, 注:不是js文件,是模版文件加载的执行的,所有写js里没效果 $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf ...

  7. 01-Spring Security框架学习--入门(二)

    一.入门案例 Spring Security 自定义登录界面 通过之前的一节 01-Spring Security框架学习--入门(一)的简单演示,Spring security 使用框架自带的登录界 ...

  8. Yii2 关闭和打开csrf 验证 防止表单多次重复提交

    原文地址:http://blog.csdn.net/terry_water/article/details/52221007 1.在Yii2配置中配置所有:所有的controller都将关闭csrf验 ...

  9. yii2关闭(开启)csrf的验证

    (1)全局使用,我们直接在配置文件中设置enableCookieValidation为true request => [ 'enableCookieValidation' => true, ...

随机推荐

  1. html 标签 图片

    <img src="e:/image/a.png"/> 在html中,图片是一个字符. <img src=" e:/image/a.png" ...

  2. MFC 点击按钮,弹出另一个对话框(模态及非模态对话框)

    1. 模态对话框 资源视图->Dialog->右键->添加资源->新建->对话框->右键->添加类. 例如:在A_dialog中点击按钮弹出B_dialog  ...

  3. ini_set() php.ini设置的功能

    ini_set()具有更改php.ini设置的功能.此函数接收两个参数:需要调整的配置变量名,以及变量的新值. [c-sharp] view plaincopyprint? <?php ini_ ...

  4. 通过Get方式传递数据

    1:因为get传参数有个特点就是不能超过256字节.如果数据大的话会溢出. 解决办法: $data=json_encode($data_array); 然后在拼接超链接: <a href=&qu ...

  5. C++ 虚析构(virtual destructor)原理

    注意:本文仅为个人理解,可能有误! 先看一段代码: #include <iostream> using namespace std; class CBase{ public: CBase( ...

  6. python提供了一个进行hash加密的模块:hashlib

    python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib ...

  7. Laravel5.1 数据库--DB运行原生SQL

    Laravel操作数据库有三种:DB原生SQL.构建器.Model.这三种依情况而决定使用哪种更合适. 那么今儿咱就从DB原生SQL说起: 1 用DB门面原生SQL语句操作 用DB门面操作的话呢 无非 ...

  8. HashMap的clear()方法和new HashMap的效率问题

    最近研究Lucene的时候,遇到的用到大量Map的问题,心生好奇,想看一下在1W,10W,100W三种数据量下,new HashMap ,与 HashMap.clear()方法的效率问题. 提前说明: ...

  9. poj3177Redundant Paths tarjan缩点

    //给一个连通图,问最少须要加入多少条边才干使得 //随意两个点都有两条不同的路走到 //对于一个强连通分量的全部随意两点都能有两点能够到达 //先用tarjan缩点,缩点以后就是一棵树,对于这个树考 ...

  10. POJ1365 Prime Land【质因数分解】【素数】【水题】

    题目链接: http://poj.org/problem?id=1365 题目大意: 告诉你一个数的质因数x的全部底数pi和幂ei.输出x-1的质因数的全部底数和幂 解题思路: 这道题不难.可是题意特 ...