Laravel - The Basics - CSRF Protection

# 前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。




# Introduction

CSRF 的全寫是?

cross-site request forgery

CSRF 是什麼?

利用使用者的 token 或 cookie 送出不合法的請求, 藉此更改使用者在後端的資料或其他惡意的動作。

以下的 Laravel example code 的意思是?
  • Example:

    <form method="POST" action="/profile">
    @csrf
    ...
    </form>
  • Answer:
    在 form 表單中附加 CSRF token, 當表單提交時會帶回該 CSRF token, server 會比對該 token 是否是 server 發出以判斷該 form 表單的來源是否可信

Laravel 中, 哪一個 middleware 會去檢驗 form 裡頭的 CSRF token 是否正確?

VerifyCsrfToken


# CSRF Token & JavaScript

resources/js/bootstrap.js




# Excluding URLs From CSRF Protection

以下的 Laravel example 是什麼意思?
  • Example:

    <?php

    namespace App\Http\Middleware;

    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

    class VerifyCsrfToken extends Middleware
    {
    protected $except = [
    'stripe/*',
    'http://example.com/foo/bar',
    'http://example.com/foo/*',
    ];
    }
  • Answer:
    在 $except property 中的 url 將不會被 VerifyCsrfToken middleware 驗證

Laravel 中, 在 tests 中, CSRF middleware 還會運作嗎?

不會




# X-CSRF-TOKEN

Laravel VerifyCsrfToken middleware 除了會從 POST parameter 中檢查 CSRF token 之外, 還會從哪裡檢查?

request 的 X-CSRF-TOKEN header

Laravel 中, 我可以將 CSRF token 發到 HTML 的哪一個 tag?

meta

以下的 Laravel 中的 HTML 程式碼的意思是?
  • Example:

    <meta name="csrf-token" content="{{ csrf_token() }}">
  • Answer:
    將 csrf token 放到 meta tag 中

以下的 Laravel 中使用 AJAX 的程式碼的意思是?,
  • Example:

    $.ajaxSetup({
    headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
    });
  • Answer:
    使用 AJAX 取出 name=”csrf-token” 的 meta tag, 並將內容設定到 headers ‘X-CSRF-TOKEN’




# X-XSRF-Token

Laravel 預設會將 CSRF token 存在 Response 的哪?

XSRF_TOKEN cookie

XSRF-TOKEN cookie

  • XSRF-TOKEN cookie
  • X-XSRF-TOKEN header
<未完成> 使用地區性的永久磁碟部署 Apps 到 Kubernetes Engine Configure a Pod to Use a ConfigMap

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×