一 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. [转] form.getForm().submit的用法及Ext.Ajax.request的小小区别

    原文地址:http://blog.csdn.net/hongleidy5000/article/details/7329325 if (!formDetail.getForm().isValid()) ...

  2. BZOJ 3223: Tyvj 1729 文艺平衡树

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 2052[Submit][Sta ...

  3. 6种php发送get、post请求的方法简明归纳与示例

    方法1: 用file_get_contents 以get方式获取内容: <?php $url='http://www.jb51.net/'; $html = file_get_contents( ...

  4. D:Wordpress_AFC插件常用代码

    获取自定义变量 //输出自定义字段title的值<?php the_field('title','options'); ?> //获取自定义字段title的值 <?php echo ...

  5. MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

    MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: ALTER TABLE tbl_name ADD [CON ...

  6. NGUI 学习笔记

    1.NGUI中UI的深度关系(新版NGUI 3.9): 在同一个Panel中,不管同不同Altas,各个UI的顺序受Depth影响 在不同Panel中,UI的顺序受Panel的Depth影响 例如Pa ...

  7. Spring实现初始化和销毁bean之前进行的操作,三种方式

    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...

  8. itrator控制迭代次数

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

  9. css浏览器兼容问题

    https://www.douban.com/group/topic/4629864/

  10. 【荐】PHP上传文件大小限制大全

    在php.ini里面可以设置最大上传文件大小 解决方法: 第一: 在php.ini里面查看如下行: upload_max_filesize = 8M post_max_size = 10M memor ...