ThinkPHP6开启CSRF表单验证

21 篇文章 0 订阅

目录

使用原因

简单配置

两种提交数据的场景

表单提交

ajax异步提交


使用原因

项目使用非前后端分离的情境下,提交表单时,开启CSRF中间件能提高操作安全性。

简单配置

开启session中间件与csrftoken验证中间件

# 修改app/middleware.php,去掉SessionInit类注释并增加FormTokenCheck类
<?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
     \think\middleware\SessionInit::class,
    // FormToken验证
    \think\middleware\FormTokenCheck::class,
];

ps:本人直接使用全局中间件来演示。

两种提交数据的场景

表单提交

1.在form表单内设置隐藏域,生成CsrfToken

# 第一种形式:生成隐藏域表单
<?=token_field()?>
# 第二种形式:定义token名称并设置值
<input type="hidden" name="__token__" value="<?=token()?>" />

2.简单HTML实例代码 

<!DOCTYPE html>
<html lang="en">

<head>
    <?=token_meta()?>
</head>

<body class="bg-gradient-primary">

<div class="container">
    <form id="loginForm" class="user" action="/admin/doLogin" method="post">
        <?=token_field()?>
        <input value="123456789@qq.com" name="account">
        <input value="123456" name="password" type="password">
        <a onclick="doLogin()" href="#" class="btn">登录</a>
    </form>
</div>
</body>
</html>
<script>
  function doLogin()
  {
     $('#loginForm').submit();
  }
</script>

ajax异步提交

1.生成meta标签

# 第一种形式:直接通过方法生成meta标签,放置在页面head块里
<?=token_meta()?>
# 第二种形式:定义meta名称并设置值
<meta name="csrf-token" content="<?=token()?>">

2.调用ajax时,通过设置headers参数携带CsrfToken

let data = $('form').serializeArray();
$.ajax({
    type:'POST',
    url: '/admin/doLogin',
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    },
    data:data,
    success:function (res) {
      console.log(res)
    },
    error:function (err) {
      console.log(err)
    }
})

3.简单HTML实例代码

<!DOCTYPE html>
<html lang="en">

<head>
    <?=token_meta()?>
</head>

<body class="bg-gradient-primary">

<div class="container">
    <form id="loginForm" class="user">
        <input value="123456789@qq.com" name="account">
        <input value="123456" name="password" type="password">
        <a onclick="doLogin()" href="#" class="btn">登录</a>
    </form>
</div>
</body>
</html>
<script>
  function doLogin()
  {
    let data = $('#loginForm').serializeArray();
    $.ajaxSetup({
      headers: {}
    })
    $.ajax({
      type:'POST',
      url: '/admin/doLogin',
      headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
      },
      data:data,
      success:function (res) {
        console.log(res)
      },
      error:function (err) {
        console.log(err)
      }
    })
  }
</script>

赋上TP6文档地址,更多细节可自行查阅:https://www.kancloud.cn/manual/thinkphp6_0/1037632

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东小记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值