在 Laravel 9+ 的上下文中,AJAX 请求需要公开 CSRF 令牌以采取必要的安全措施。然而,不同的令牌放置方法可能会影响代码的优雅和组织。两种主要方法似乎是:
方法 1:通过 Blade 语法直接插入 CSRF 令牌
在此方法中,CSRF 令牌通过 Blade 语法直接嵌入到 JavaScript 中。 (在很多地方重复相同的代码)
$(document).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
}
});
});
虽然这种方法将令牌保留在 HTML 正文之外,但它需要 JavaScript 文件中的 Blade 语法,从而使关注点分离变得复杂。
方法2:从元标签中提取CSRF令牌
此方法涉及将 CSRF 令牌放入 HTML 元标记中,然后提取它以在 AJAX 设置中使用。
<meta name="csrf-token" content="{{ csrf_token() }}">
$(document).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});
在这里,即使令牌以 HTML 形式公开(无论哪种方式都公开),它也简化了 JavaScript 文件管理、重用,并且更容易将代码/关注点分开。
考虑到上述情况,我猜方法 2 因其优雅和关注点分离而更好?或者 Laravel 中是否有其他最佳实践来通过 AJAX 请求管理 CSRF 令牌放置,从而提供更好的安全性和代码组织平衡?我期待您的见解。
PS 我看了例如https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html但其中一些超出了我的理解
这里,即使令牌在 HTML 中公开(无论哪种方式都公开)
令牌仅公开给您想要拥有它的用户(以便他们可以将其发送回给您)。
它不会暴露给任何攻击者。 (除非他们破坏了服务器和浏览器之间的通信,这意味着他们已经拥有比成功的 CSRF 攻击更多的访问权限。)
采取直接的选择。