ชุด Symfony นี้ให้การป้องกันการปลอมแปลงคำขอข้ามไซต์ (CSRF หรือ XSRF) สำหรับแอปพลิเคชันฝั่งไคลเอ็นต์ที่ร้องขอจุดสิ้นสุดที่ Symfony มอบให้ผ่าน XHR
ได้รับอิทธิพลและแรงบันดาลใจอย่างมากจาก DunglasAngularCsrfBundle
หากต้องการจัดเก็บโทเค็น CSRF ฝั่งไคลเอ็นต์ คุกกี้ที่มีโทเค็นสามารถตั้งค่าตามเส้นทางที่กำหนดไว้ล่วงหน้าตั้งแต่หนึ่งเส้นทางขึ้นไป บันเดิลได้รับการกำหนดค่าไว้ล่วงหน้าในลักษณะที่ไคลเอ็นต์ http ฝั่งไคลเอ็นต์สมัยใหม่ เช่น Axios จะรับคุกกี้ดังกล่าวโดยอัตโนมัติ ในการร้องขอครั้งต่อๆ ไปไปยัง Symfony โทเค็น CSRF จะสามารถเพิ่มลงในส่วนหัว HTTP เพื่อตรวจสอบฝั่งเซิร์ฟเวอร์ได้ ขอย้ำอีกครั้งว่าไคลเอ็นต์บางรายอาจดำเนินการโดยอัตโนมัติอยู่แล้ว เช่น Axios
ใช้ Composer เพื่อติดตั้งบันเดิลนี้:
composer require dneustadt/csrf-cookie-bundle
# config/packages/dneustadt_csrf_cookie.yaml
dneustadt_csrf_cookie :
# Generally enable/disable the CSRF protection
enable : true
# ID used to generate token
id : csrf
# Name of the cookie the token is stored in
name : XSRF-TOKEN
# Cookie expiration
expire : 0
# Cookie path
path : /
# Cookie domain
domain : null
# Cookie HttpOnly
httpOnly : true
# Cookie secure
secure : false
# Name of the HTTP header the token is expected to be stored in
header : X-XSRF-TOKEN
# Cookie same site policy
sameSite : lax
สามารถตั้งค่าเส้นทางเพื่อให้ ( create
) โทเค็น รักษาความปลอดภัยด้วย ( require
) โทเค็น หรือทั้งสองอย่าง
เนื่องจากค่าเริ่มต้นของเส้นทางเดียวหรือการรวบรวมเส้นทางถูกใช้เพื่อกำหนดค่าลักษณะการทำงาน จึงเป็นไปได้ที่จะดำเนินการดังกล่าวโดยใช้ไฟล์การกำหนดค่าหรือคำอธิบายประกอบ
# config/routes.yaml
api_controllers :
resource : ../src/Controller/Api
type : annotation
defaults :
csrf :
# bool or array of allowed methods
create : true
# bool or array of allowed methods
require :
- ' POST '
- ' PUT '
- ' PATCH '
- ' DELETE '
# array of route names to be excluded from create/require in this collection
exclude :
- ' app_api_blog_index '
# additional condition using ExpressionLanguage syntax
condition : ' request.isXmlHttpRequest() '
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเงื่อนไข โปรดดูที่ ExpressionLanguage
เป็นคำอธิบายประกอบ:
// src/Controller/Api/ExampleController.php
namespace App Controller Api ;
// ...
class ExampleController extends AbstractController
{
/**
* @Route("/api/index", methods={"GET","HEAD"}, defaults={"csrf": {"create": true}})
*/
public function index ()
{
// ...
}
}
การป้องกันแบบฟอร์ม CSRF ในตัวจะถูกปิดใช้งานโดยอัตโนมัติสำหรับเส้นทางที่ได้รับการกำหนดค่าให้ปลอดภัยโดยใช้โทเค็นที่จัดเก็บไว้ในส่วนหัว HTTP โดยมีเงื่อนไขว่าโทเค็นดังกล่าวสามารถตรวจสอบได้สำเร็จ