提升Laravel 9+中AJAX的CSRF令牌管理:最佳實踐
<p>In the context of Laravel 9 , AJAX請求需要暴露CSRF令牌以確保必要的安全措施。然而,不同的令牌放置方法可能會影響程式碼的優雅和組織。主要的兩種方法如下:<br /><br />方法1:透過Blade語法直接插入CSRF令牌<br /><br />在這種方法中,CSRF命令牌透過Blade語法直接嵌入JavaScript中。 (在多個地方重複相同的程式碼)</p><p><br /></p>
<pre class="brush:js;toolbar:false;">$(document).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': "{{ csrf_token() }}"
}
});
});
</pre>
<p>雖然這種方法可以將令牌保持在HTML主體之外,但它需要在JavaScript檔案中使用Blade語法,使關注點的分離變得複雜。 <br /><br />方法2:從元標記中提取CSRF令牌<br /><br />這種方法涉及將CSRF令牌放置在HTML元標記中,然後提取它以在AJAX設定中使用。 </p><p><br /></p>
<p><code><meta name="csrf-token" content="{{ csrf_token() }}"> </code></p>
<pre class="brush:js;toolbar:false;">$(document).ready(function() {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});
</pre>
<p>在這種方法中,儘管令牌在HTML中暴露出來(無論如何都會暴露),但它簡化了JavaScript檔案的管理,重複使用,並且更容易保持程式碼/關注點的分離。 <br /><br />考慮到上述情況,我猜想方法2更好,因為它更優雅,能夠更好地分離關注點。或者在Laravel中有沒有其他最佳實踐來管理使用AJAX請求時的CSRF令牌放置,以提供更好的安全性和代碼組織的平衡?期待您的見解。 <br /><br />PS:我查看了例如https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html,但其中一些內容超出了我的理解範圍。 </p><p><br /></p>