# CSRF保护
HDPHP 框架支持表单令牌验证功能,可以有效防止跨站请求伪造 (CSRF) 攻击,当发生CSRF 攻击提交非法表单时,系统会自动进行拦截。
[TOC]
## 配置文件
配置文件为config/csrf.php
> 开启调试模式时不进行csrf验证
## 表单令牌
在html 中的form 表单标签中添加 {{csrf_field()}}标签,系统会自动创建 一个隐藏表单用于提交令牌。
如果使用 View::make() 生成的页面,可以不用添加 {{csrf_field()}} 系统会自动生成。
```
<form method="POST" action="">
{{ csrf_field() }}
//生成表单: <input type='hidden' name='csrf_token' value='...'/>
...
</form>
```
## X-CSRF-Token
除了将 CSRF 令牌作为 POST 参数进行验证外,还可以通过设置 X-CSRF-Token 请求头来实现验证,系统的Csrf 中间件会检查 X-CSRF-TOKEN 请求头,首先创建一个 meta 标签并将令牌保存到该 meta 标签:
```
<meta name="csrf-token" content="{{ csrf_token() }}">
```
然后在 js 库(如 jQuery)中添加该令牌到所有请求头,这为基于 AJAX 的应用提供了简单、方便的方式来避免 CSRF 攻击:
```
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
```
## X-XSRF-Token
HDPHP 还会将 CSRF 令牌保存到名为 XSRF-TOKEN 的 Cookie 中,你可以使用该 Cookie 值来设置 X-XSRF-TOKEN请求头。一些 JavaScript 框架,比如 Angular,会为你自动进行设置,基本上你不太需要手动设置这个值。
## Ajax提交
如果是 SPA应用或 Ajax 请求时可以使用 {{csrf_token()}} 生的的令牌值提交到服务器。
以下是jquery示例代码。
> 使用上面的 X-CSRF-Token 方法会更简单些
```
<script>
$.ajax({
type: "POST",
url: "test.php",
data:"csrf_token={{csrf_token()}}&name=hdphp",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
</script>
```
## 关闭验证
如果不希望令牌验证,可以直接修改配置文件或通过配置服务临时关闭令牌验证。
使用Config::set()关闭令牌时需要写在 global 中间件中,具体使用请 查看[中间件](http://www.kancloud.cn/houdunwang/hdphp3/215212) 章节。
```
Config::set('app.token_on',false);
```
## 排除验证
根据需要可以排除验证的url,需要在 system/config/csrf.app 配置文件中修改 except 配置项即可,以下为示例代码。
```
'except'=>[
'host=4',//所有包含 host=4 的URL不进行csrf验证
'id=[0-9]+',//支持正则排除,排除 id为数字的url
]
```
- 文档已经迁移到后盾人
- 介绍
- 框架特性
- 开发规范
- 许可协议
- 作者向军
- 安装框架
- 更新框架
- 基础
- 入口文件
- 应用配置
- 优雅链接
- 目录结构
- 系统常量
- 自动加载
- 应用密钥
- 系统函数
- CSRF保护
- 依赖注入
- 跨域访问
- 配置
- 配置文件
- 基本功能
- 扩展配置
- c 函数
- 控制器
- 定义声明
- 基本使用
- 相关函数
- 响应消息
- 路由
- 基础知识
- 基础路由
- 路由参数
- 参数检测
- 依赖注入
- 控制器
- 分组路由
- RESTful
- 别名路由
- 数据
- 配置相关
- 核心操作
- 查询构造器
- 日志记录
- 分页处理
- 事务处理
- 函数相关
- 数据库
- 数据迁移
- 数据填充
- 模型
- 定义模型
- 模型动作
- 模型验证
- 自动完成
- 自动过滤
- 字段保护
- 数据填充
- 多表关联
- 分页处理
- 仓库
- 数据仓库
- 查询规则
- 视图
- 基础知识
- 模板配置
- 模板文件
- 分配数据
- 系统标签
- 扩展标签
- 缓存模板
- 模板继承
- 视图函数
- widget
- vue组件
- 中间件
- 中间件
- 缓存
- 基本操作
- 文件缓存
- 数据表缓存
- 服务
- 服务容器
- 定制服务
- 相关函数
- 请求
- 基本使用
- 请求扩展
- 测试
- 基础知识
- 基本使用
- HTTP测试
- 调试
- 调试模式
- 日志管理
- 组件
- 多语言
- 响应处理
- Cookie
- Session
- 验证码
- XML
- 自动验证
- 文件处理
- 压缩解压
- RBAC
- 数组增强
- 分页管理
- 图像处理
- 生成静态
- 加密解密
- 字符串
- 数据集合
- 工具服务
- 目录操作
- 邮件发送
- CURL
- QQ登录
- 数据备份
- 购物车
- 日志处理
- 命令组件
- 二维码
- 后盾云
- 日期处理
- 阿里
- 支付宝
- 阿里云直播
- 阿里云短信
- 阿里云邮件
- 阿里云OSS
- SOCKET
- 启动与关闭
- 前端
- 微信