gpt4 book ai didi

php - Laravel CSRF 保护

转载 作者:可可西里 更新时间:2023-11-01 12:39:05 25 4
gpt4 key购买 nike

我知道什么是 CSRF 攻击,我已经阅读了有关它的文档,但是我无法深入理解 CSRF 保护的工作原理,并且有一些我找不到的一般性问题。

documentation它说 Laravel 自动为

生成一个 token

... each active user session managed by the application.

  1. 它在哪里创建 token (代码的哪一部分触发它)?
  2. token 创建后存储在 cookie 中的什么位置?在 session 上?我如何提取并查看已存储的内容?这一切实际上是由 session.php 控制的吗?
  3. 这是什么意思,当我重新加载页面时, token 是否仍然与 session.php 具有 120 分钟的默认生命周期相同?
  4. 如果我已将我的 domain 属性设置为 ".",当我导航到由同一应用程序处理的子域时,该 cookie 会发生什么情况。 . env('APP_URL')?

因此,一旦创建了 token 并将其存储在某处,在发出请求时,我必须向表单提供 csrf_token() 隐藏属性,或者将其生成为元字段并重定向到如果我正在执行 AJAX 请求,我的 JS 文件。

  1. 那么当我实际发出请求时,底层会发生什么?请求生成csrf_token(),Laravel 加密cookie,Laravel 检查发送的cookie 是否与session 中的cookie 相同。如果是,则说明请求有效,如果不是,则抛出TokenMissmatchException?

  2. 这是否意味着 cookie 生命周期内的每个请求都将具有相同的 token ?

  3. Laravel 是否以不同方式加密请求和响应 cookie?如果我在 EncryptCookies 类中从 cookie 加密中排除 token ,我会得到相同的 token ,但当我离开它时,哈希值不同。

  4. 在请求数据中提供 _token 与作为 X-CSRF-TOKEN header 转发 token 有何不同?如果我看到它们未加密,Laravel 如何验证它们?他们在请求后会被加密吗?

最佳答案

  1. Where does it create the token (what part of the code triggers it)?

通过帮助文件后

/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

它有 csrf_token() 辅助方法的定义,它调用了 token 方法

/vendor/laravel/framework/src/Illuminate/Session/Store.php

并且如果您检查调用 regenerateToken()start() 如果 _token 尚未设置,它会随机保存 40以_token

为键的 session 的字符串
/**
* Regenerate the CSRF token value.
*
* @return void
*/
public function regenerateToken()
{
$this->put('_token', Str::random(40));
}
  1. Where is the token stored after creation, in cookie? In session? How can I extract and see what has been stored? Is this all actually controlled by session.php?

token 存储在 session 中,您可以使用session('_token') 提取它。 session过期时间在session.php中使用

控制
'lifetime' => env('SESSION_LIFETIME', 120),

'expire_on_close' => false,
  1. What does this mean when I reload the page, is the token still the same as the session.php has 120 min default lifetime?

如果你检查 /vendor/laravel/framework/src/Illuminate/Session/Store.php 中的 start()

/**
* Start the session, reading the data from a handler.
*
* @return bool
*/
public function start()
{
$this->loadSession();

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

return $this->started = true;
}

如果 session 没有_token,则重新生成 token 。所以 _token 在 session 过期之前都是一样的

关于php - Laravel CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com