token详解

获取token值

public function getCsrfToken()
{
    session()->regenerateToken();
   $token=  csrf_token();
   return response()->json(['token'=>$token]);
}
{!! csrf_field !!}

Laravel框架中避免CSRF攻击很简单:Laravel自动为每个用户Session生成了一个CSRF Token,该Token可用于验证登录用户和发起请求者是否是同一人,如果不是则请求失败。

Laravel提供了一个全局帮助函数 csrf_token 来获取该Token值,因此只需在视提交图表单中添加如下HTML代码即可在请求中带上Token:

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">  该段代码等同于全局帮助函数csrf_field的输出:

Blade模板引擎中还可以使用如下方式调用:

{!! csrf_field() !!}


3、从CSRF验证中排除指定URL

并不是所有请求都需要避免CSRF攻击,比如去第三方API获取数据的请求。

可以通过在VerifyCsrfTokenapp/Http/Middleware/VerifyCsrfToken.php中间件中将要排除的请求URL添加到$except属性数组中:

<?php

    namespace App\Http\Middleware;

    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

    class VerifyCsrfToken extends BaseVerifier
    {
        /**
         * 指定从 CSRF 验证中排除的URL
         *
         * @var array
         */
        protected $except = [
            'testCsrf'
        ];
    }
 

X-CSRF-Token及其使用:

使用Ajax  提交post表单  可以把 Token  存在 meta 中

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在全局Ajax中使用这种方式设置X-CSRF-Token请求头并提交

 
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});


Laravel中CSRF验证原理分析

 

1)首先Laravel开启Session时会生成一个token值并存放在Session中(Illuminate\Session\Store.php第90行start方法),对应源码如下:

 
public function start()
{
    $this->loadSession();

    if (! $this->has('_token')) {
        $this->regenerateToken();
    }

    return $this->started = true;
}



VerifyToken 是中间件 -> handle()->isReading(判断请求的方式 排除get,head,options) -> showPassThough 判断 路由是否在$except 内排除 做了排除也不验证 最后通过 TokenMatch 方法判断 CSRF TOKEN 值和SESSION 中的TOKEN 是否相等 相同则通过验证

否则 抛出异常 :tokensMatch方法首先从Request中获取_token参数值,如果请求中不包含该参数则获取X-CSRF-TOKEN请求头的值,如果该请求头也不存在则获取X-XSRF-TOKEN请求头的值,需要注意的是X-XSRF-TOKEN请求头的值需要调用Encrypterdecrypt方法进行解密。
 

2)然后重点分析VerifyToken中间件的handle方法,该方法中先通过isReading方法判断请求方式,如果请求方法是HEADGETOPTIONS其中一种,则不做CSRF验证;

 

3)再通过shouldPassThrough方法判断请求路由是否在$excpet属性数组中进行了排除,如果做了排除也不做验证;

 

4)最后通过tokensMatch方法判断请求参数中的CSRF TOKEN值和Session中的Token值是否相等,如果相等则通过验证,否则抛出TokenMismatchException异常。






对应源码如下:

 
public function handle($request, Closure $next)
{
    if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {
        return $this->addCookieToResponse($request, $next($request));
    }

    throw new TokenMismatchException;
}


### 大型语言模型中的Token解析 #### 什么是Token? 在大型语言模型(LLM)中,Token是处理文本数据的基础单元。这些基础单元是将自然语言转换成机器可理解格式的关键步骤[^2]。 #### 标记化过程(Tokenization) 标记化是指将连续的自然语言文本分解为离散单位的过程。这个过程涉及将文本分割成更小的部分——即Tokens。每个Token可以代表一个完整的词、部分词(如子词)、或是单个字符。例如,“transformer”这个词可能会被拆解成多个子词token:“trans-”,“form-”,以及“er”。这种灵活性使得模型能更好地理解和生成少见或复合词语。 #### Token的数量限制及其原因 由于基于Transformer架构的语言模型具有较高的时间和空间复杂度,随着输入序列长度增加,计算量会迅速膨胀至难以管理的程度。因此,大多数LLM都设定了最大允许的input/output tokens数目,常见的范围是从几千到几万不等。这样的设计不仅有助于保持性能稳定,也便于开发者合理规划资源分配。 #### Tokens作为数值标识符的作用 当原始文本经过分词后得到一系列tokens时,在送入神经网络之前还需要进一步编码为计算机易于操作的形式—也就是整数ID或其他类型的向量表示。这样做的好处是可以让不同位置上的相同词汇共享相同的参数更新路径,从而提高泛化能力;同时也方便后续阶段进行注意力机制下的交互运算。 ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "Transformers are amazing!" encoded_input = tokenizer(text, return_tensors='pt') print(encoded_input['input_ids']) ``` 这段代码展示了如何利用Hugging Face提供的`BertTokenizer`类来进行简单的英文句子编码。它会输出该句对应的tensor形式的IDs列表,这就是所说的token ID序列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值