一 CSRF 概念

CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

Yii2 中的CSRF配置

Yii2 默认是启用CSRF令牌验证

配置在main.php中:

'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'enableCookieValidation' => true,
'cookieValidationKey' => 'cookvalid',
],
…………

若要取消CSRF验证有两种方法

1. 在要取消的控制器中添加:

public $enableCsrfValidation = false;

2. 在配置中取消enableCookieValidation的验证

'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'enableCookieValidation' => false,
'cookieValidationKey' => 'cookvalid',
],
…………

二 启用CSRF的 POST验证

当启用了csrf后, 所有表单POST提交的数据就会进行验证,在表单中添加CSRF有两种方法

1. 使用Yii挂件生成html

这样会自动生成带有隐藏表单的_csrf

<?php
$form = ActiveForm::begin([
'id' => 'login-form',
]);
?>
<input type="hidden" name="jfinal_token" value="${jfinal_token }" />
<div class="form-group">
<label for="j_username" class="t">用户名:</label>
<?php echo Html::input('type', 'LoginForm[username]', $model->username, ['class' => 'form-control x319 in', 'placeholder' => 'Username', 'autocomplete' => 'off']); ?>
</div>
<div class="form-group"> <label for="j_password" class="t">密 码:</label>
<?php echo Html::input('password', 'LoginForm[password]', $model->password, ['class' => 'form-control x319 in', 'placeholder' => 'Password']); ?>
</div> <?php ActiveForm::end(); ?>

2. 手动添加_csrf

在form表单中手动添加隐藏表单,也适用于ajax的手动添加_csrf

<input type="hidden" value="<?php echo Yii::$app->request->csrfToken; ?>" name="_csrf" >

三 提交POST提示“您提交的数据无法验证”

使用原生or Yii挂件生成html带有_csrf 表单提交仍然提示“您提交的数据无法验证”

表单html如下:

<div class="login_form">
<form id="login-form" action="/default/login" method="post">
<input type="hidden" name="_csrf" value="bDV6RjFCS0RURzcwCAwKNC5AIyIDdy19BkAOF38YGSkLGCI2UgcEMQ==">
<div class="form-group">
<label for="j_username" class="t">用户名:</label>
<input type="type" class="form-control x319 in" name="LoginForm[username]" placeholder="Username" autocomplete="off">
</div>
<div class="form-group">
<label for="j_password" class="t">密 码:</label>
<input type="password" class="form-control x319 in" name="LoginForm[password]" placeholder="Password">
</div>
</form>
</div>

_csrf 是Yii自动生成,不存在字符串不匹配

后来找到问题:

render的时候使用了exit, 应使用return

*注: render 时也不能用echo 或 die()

解决办法:

 return $this->render('action',['t'=>$t,'text'=>$text]);

封装render

 return $this->display([
't' => $t,
'text' => $text,
]); /**
* render页面
* @param array 当$i为array模版为$this->action,数据源为$i
* 当$i为string,模版为$i,数据源为$param
*/
protected function display($i = array(), $param = array()) {
$data = array();
if (is_string($i)) {
$tpl = $i;
$data = $param;
} else {
$data = $i;
$tpl = $this->action->id;
} return $this->render(strtolower($tpl), $data);
}

解决Yii2给数据库表添加字段后对应模型无法识别到该属性的原因

数据库表的结构被缓存了

执行:

//清理所有表结构缓存数据
Yii::$app->db->getSchema()->refresh();

解决Yii2 启用_csrf验证后POST数据仍提示“您提交的数据无法验证”的更多相关文章

  1. Http协议详解,获取doPost,doGet提交的数据,以及编码问题

    一 什么是Http协议 http协议: 浏览器客户端 和  服务器端 之间数据传输的格式规范 二 如何查看Http协议的内容 1)使用火狐的firebug插件(右键->firebug->网 ...

  2. 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

    问题描述 如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人.从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6 开始这个功能是默认 ...

  3. yii2 数据导出 excel导出以及导出数据时列超过26列时解决办法

    作者:白狼 出处:http://www.manks.top/article/yii2_excel_extension​ 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给 ...

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

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

  5. 解决Yii2中刷新网页时验证码不刷新的问题

    解决Yii2中刷新网页时验证码不刷新的问题 [ 2.0 版本 ] ljfrocky  2015-05-30 19:39:00  1304次浏览 5条评论 10110 在Yii2框架中,如果在表单中使用 ...

  6. Yii 开发微信 '您提交的数据无法被验证'

    使用Yii开发微信时,出现 [error][yii\web\HttpException:] exception 'yii\web\BadRequestHttpException' with messa ...

  7. jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...

  8. 金蝶KIS专业版替换SXS.dll 遭后门清空数据被修改为【恢复数据联系QQ 735330197,2251434429】解决方法 修复工具。

    金蝶KIS专业版 替换SXS.dll 遭后门清空数据(凭证被改为:恢复数据联系QQ 735330197,2251434429)恢复解决方法. [客户名称]:山东青岛福隆发纺织品有限公司 [软件名称]: ...

  9. FPGA设计千兆以太网MAC(3)——数据缓存及位宽转换模块设计与验证

    本文设计思想采用明德扬至简设计法.上一篇博文中定制了自定义MAC IP的结构,在用户侧需要位宽转换及数据缓存.本文以TX方向为例,设计并验证发送缓存模块.这里定义该模块可缓存4个最大长度数据包,用户根 ...

随机推荐

  1. 【转】Java面试题全集2.2(上)

    146.什么是IoC和DI?DI是如何实现的? 答:IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠 ...

  2. nginx 报错 HTTP ERROR 500 (PHP数组简写模式)

    同样的代码放在Apache上执行可以执行,在nginx上面就报错了. 百度出来一堆结果貌似都不对,然后只有注释代码->运行程序,一步步找到问题所在 $buffer = []; 这一步报错了 原来 ...

  3. download ncRNA sequences form NCBI

    #!/bin/bash usage() { echo;echo "Usage: ./`basename $0` [gi number list] [number of cpu]"; ...

  4. Java都有什么进阶技术

    Java都有什么进阶技术?   看到有人给题主推荐<代码整洁之道>,评论有人说那不是JAVA进阶的书- 私以为,一些人对JAVA进阶的理解片面了,JAVA不过也是一门语言,提升和进阶还是内 ...

  5. JavaScript 数组中的 indexOf 方法

    let arr = ['orange', '2016', '2016']; arr.indexOf('orange'); //0 arr.indexOf('o'); //-1 arr.indexOf( ...

  6. 关于linux asp.net MVC网站中 httpHandlers配置无效的处理方法

    近期有Jexus用户反映,在Linux ASP.NET MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404( ...

  7. 处理 input 上传图片,浏览器读取图片大小过程中遇到到的坑(兼容IE8\9)

    为了 解决这个坑~ 已经 累傻了.. 周末再 写吧..

  8. css3动画简介以及动画库animate.css的使用

    在这个年代,你要是不懂一点点css3的知识,你都不好意思说你是个美工.美你妹啊,请叫我前端工程师好不好.呃..好吧,攻城尸...呵呵,作为一个攻城尸,没有点高端大气上档次的东西怎么能行呢,那么css3 ...

  9. GDI+ 笔记

    1.GDI+模板 #include<windows.h> #include<GdiPlus.h> #include <time.h> #include <ma ...

  10. itrator控制迭代次数

    <s:iterator value="diys" status="d" begin="0" end="10" st ...