# 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.hmoore.net/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
- 啟動與關閉
- 前端
- 微信