Perlindungan CSRF


CSRF - Senarai Putih

X-CSRF-TokenLaravel memudahkan untuk melindungi aplikasi anda daripada salib -serangan pemalsuan permintaan tapak (CSRF), serangan berniat jahat yang bergantung pada identiti pengguna yang disahkan untuk menjalankan arahan yang tidak dibenarkan.

Laravel akan menjana "token" CSRF secara automatik untuk setiap sesi pengguna aktif. Token digunakan untuk mengesahkan bahawa pengguna yang disahkan adalah yang membuat permintaan kepada aplikasi.

Setiap kali anda mentakrifkan borang HTML dalam aplikasi anda, anda harus memasukkan medan teg CSRF tersembunyi dalam borang supaya perisian tengah perlindungan CSRF boleh mengesahkan permintaan, anda boleh menggunakan arahan @csrf Blade untuk menjana medan token, seperti berikut:
<form method="POST" action="/profile">
    @csrf  
     ...
  </form>
Termasuk dalam kumpulan middleware web VerifyCsrfToken middleware akan mengesahkan secara automatik sama ada token dalam permintaan sepadan dengan token yang disimpan dalam sesi.

Token CSRF & JavaScript

Apabila membina aplikasi yang dikuasakan oleh JavaScript, adalah mudah untuk mendayakan fungsi HTTP
JavaScript Perpustakaan secara automatik melampirkan token CSRF pada setiap permintaan. Secara lalai, fail resources/js/bootstrap.js akan menggunakan nilai dalam teg meta csrf-token yang didaftarkan dengan pustaka fungsi HTTP Axios. Jika anda tidak menggunakan pustaka ini, anda perlu mengkonfigurasi gelagat ini secara manual untuk aplikasi anda.

@csrf Blade 指令来生成令牌字段,如下:

<?php
   namespace App\Http\Middleware;
   use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
   class VerifyCsrfToken extends Middleware{   
     /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */  
     protected $except = [    
         'stripe/*',        
         'http://example.com/foo/bar',        
         'http://example.com/foo/*',    
         ];
       }

包含在 web 中间件组里   VerifyCsrfToken  中间件 会自动验证请求里的令牌是否与存储在会话中令牌匹配。

CSRF 令牌 & JavaScript

当构建由 JavaScript 驱动的应用时,可以方便的让 JavaScript HTTP
函数库发起每一个请求时自动附上 CSRF 令牌。默认情况下,resources/js/bootstrap.js 文件会用 Axios HTTP 函数库注册的  csrf-token

Senarai Putih CSRF

Kadangkala anda mungkin mahu menetapkan satu set URL dilindungi CSRF yang tidak diingini. Contohnya, jika anda menggunakan Stripe untuk memproses pembayaran dan menggunakan sistem webhook mereka, anda perlu mengecualikan laluan pengendali webhook Stripe daripada perlindungan CSRF kerana Stripe tidak menghantar token CSRF ke laluan anda.

Biasanya, anda boleh meletakkan jenis laluan ini di luar routes/web.php, kerana web middleware RouteServiceProvider digunakan pada fail ini semua laluan dalam. Walau bagaimanapun, anda juga boleh mengecualikan perlindungan CSRF untuk laluan tersebut dengan menambahkan URL sedemikian pada atribut $except bagi perisian tengah VerifyCsrfToken, seperti yang ditunjukkan di bawah: routes/web.php 外,因为 RouteServiceProviderweb 中间件适用于该文件中的所有路由。不过,你也可以通过将这类 URL 添加到 VerifyCsrfToken 中间件的 $except 属性来排除对这类路由的 CSRF 保护,如下所示:

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

{tip} 当 运行测试 时, CSRF 中间件会自动禁用。

X-CSRF-TOKEN

除了检查 POST 参数中的 CSRF 令牌外, VerifyCsrfToken 中间件还会检查 X-CSRF-TOKEN 请求头。你应该将令牌保存在 HTML meta 标签中,如下:

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

然后,一旦你创建了 meta 标签,就可以指示像 jQuery 这样的库自动将令牌添加到所有请求的头信息中。还可以为基于 AJAX 的应用提供简单,方便的 CSRF 保护。如下:

rrreee

{tip} 默认情况下,  resources/js/bootstrap.js 文件会用 Axios HTTP  函数库注册 csrf-token meta 标签中的值。如果不使用这个函数库,则需要为你的应用手动配置此行为。

X-XSRF-TOKEN

Laravel 将当前的 CSRF 令牌存储在一个 XSRF-TOKEN cookie
中,该 cookie 包含在框架生成的每个响应中。你可以使用 cookie 值来设置 X-XSRF-TOKEN 请求头。

这个 cookie 主要是作为一种方便的方式发送的,因为一些  JavaScript 框架和库,例如 Angular 和 Axios ,会自动将它的值放入 X-XSRF-TOKENrrreee< blockquote>

{ tip} Perisian tengah CSRF dilumpuhkan secara automatik apabila menjalankan ujian.
🎜X-CSRF-TOKEN🎜🎜Selain menyemak parameter POST Selain token CSRF dalam permintaan, perisian tengah VerifyCsrfToken juga menyemak pengepala permintaan X-CSRF-TOKEN. Anda harus menyimpan token dalam teg meta HTML, seperti ini: 🎜rrreee🎜 Kemudian, setelah anda mencipta teg meta, anda boleh mengarahkan perpustakaan seperti jQuery untuk secara automatik token ditambahkan pada maklumat pengepala semua permintaan. Ia juga boleh memberikan perlindungan CSRF yang mudah dan mudah untuk aplikasi berasaskan AJAX. Seperti berikut: 🎜rrreee
🎜{tip} Secara lalai, fail resources/js/bootstrap.js akan menggunakan pustaka fungsi HTTP Axios untuk mendaftarkan csrf-token nilai tag meta. Jika anda tidak menggunakan pustaka ini, anda perlu mengkonfigurasi tingkah laku ini secara manual untuk aplikasi anda. 🎜
🎜🎜🎜
🎜🎜X-XSRF-TOKEN🎜🎜Laravel akan arus Token CSRF disimpan dalam kuki XSRF-TOKEN
yang disertakan dengan setiap respons yang dijana oleh rangka kerja. Anda boleh menggunakan nilai kuki untuk menetapkan pengepala permintaan X-XSRF-TOKEN. 🎜🎜Kuki ini dihantar terutamanya sebagai kemudahan, kerana sesetengah rangka kerja dan perpustakaan JavaScript, seperti Angular dan Axios, secara automatik meletakkan nilainya ke dalam pengepala X-XSRF-TOKEN. 🎜🎜Artikel ini pertama kali diterbitkan di laman web 🎜LearnKu.com🎜. 🎜🎜