# 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 ] ```