In the context of 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设置中使用。
$(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,但其中一些内容超出了我的理解范围。
令牌只对你希望拥有它的用户暴露(这样他们才能将其发送回给你)。
它不会暴露给任何攻击者。(除非他们以某种方式破坏了服务器和浏览器之间的通信,这意味着他们已经获得比成功的CSRF攻击更多的访问权限。)
选择直接的选项。