Tìm hiểu về việc chia rẻ Cross-Origin Resource
Học cách tận dụng sức mạnh của Laravel CORS trong bài hướng dẫn này. Khám phá nó là gì và khai phá tiềm năng của nó trong việc chia sẻ tài nguyên qua các nguồn gốc gốc khác nhau một cách trôi chảy.
Laravel đã hỗ trợ CORS trong một thời gian dài; tuy nhiên, cho đến các phiên bản gần đây hơn, nó chỉ đến từ các gói bên thứ ba. Hãy tìm hiểu về CORS trong Laravel, nó là gì và tại sao nó quan trọng.
CORS viết tắt của Cross-Origin Resource Sharing. Đây là một cơ chế cho phép bạn thực hiện yêu cầu đến một tên miền khác một cách an toàn. Nó xác định một tập hợp các tiêu đề mà máy chủ có thể sử dụng để kiểm soát những nguồn gốc nào có thể truy cập vào tài nguyên của nó. Nhưng điều này có ý nghĩa gì đối với bạn?
Là người xây dựng nhiều API, tôi đã quen với CORS. Điều này đã trở thành thứ tự thường xuyên ở thời điểm này. Laravel, theo mặc định, tích hợp hỗ trợ CORS, trong đó nó sẽ đọc từ tệp config/cors.php để xây dựng tự động các quy tắc bảo vệ dựa trên các giá trị đã được cấu hình. Hãy cùng đi qua các tùy chọn trong tệp này để hiểu ý nghĩa của chúng đối với chúng ta.
Paths
Tùy chọn đầu tiên của chúng ta là “paths”, mặc định có những thông số sau đây:
'paths' => ['api/*', 'sanctum/csrf-cookie'],
Trong tùy chọn này, chúng ta đang chỉ định middleware CORS phải khớp với bất kỳ yêu cầu nào được liệt kê ở đây và cho phép CORS tiếp tục kiểm tra tiếp theo. Nếu yêu cầu đến không khớp với bất kỳ mẫu nào chúng ta thêm vào cấu hình, chúng ta sẽ tự động chặn bất kỳ yêu cầu nào từ các máy chủ bên ngoài.
Methods
Tùy chọn tiếp theo của chúng ta là “allowed methods”, mặc định được cấu hình như sau:
'allowed_methods' => ['*'],
Mặc định, Laravel cho phép bất kỳ phương thức nào được truyền từ bên ngoài, có nghĩa là một tích hợp API không cần xem xét đặc biệt nào. Bạn có thể cứng nhắc hoặc linh hoạt tùy ý ở đây. Điều này hoàn toàn thuộc quyết định của bạn. Thông thường, tôi giữ giá trị mặc định ở đây, vì hầu hết các API mà tôi thường xây dựng mong muốn có sự kiểm soát hoàn toàn từ bên ngoài theo một số mặt định. Nếu chúng ta thay đổi thành:
'allowed_methods' => ['GET', 'POST','PUT','PATCH'],
Điều này có nghĩa là chúng ta muốn từ chối bất kỳ yêu cầu ngoại vi nào cụ thể là yêu cầu ‘DELETE‘ hoặc yêu cầu không được liệt kê trong cấu hình CORS. Nếu bạn có một API chỉ cho phép đọc công khai, thì khả năng cao bạn sẽ cấu hình khác cho điều này.
Origins
Tiếp theo, chúng ta sẽ xem xét các nguồn gốc được cho phép, mặc định được cấu hình như sau:
'allowed_origins' => ['*'],
Những gì chúng ta đang nói mặc định là chúng ta sẽ cho phép kết nối hoặc yêu cầu đến từ bất kỳ nguồn gốc nào (còn được gọi là địa chỉ IP hoặc máy chủ). Nếu chúng ta đang xây dựng các API nội bộ, chúng ta sẽ xem xét cấu hình này thành một dải địa chỉ IP hoặc giới hạn nó cho các tên miền cụ thể. Điều này giúp bảo vệ bạn khỏi việc có người yêu cầu từ các vị trí mà bạn có thể không muốn. Một lần nữa, nếu API của bạn là công khai, bạn có thể giữ cấu hình này như vậy. Xin vui lòng ghi nhớ cài đặt này nếu bạn gặp vấn đề về CORS khi tích hợp với API của bạn.
Bạn có thể sử dụng một phần cấu hình bổ sung để không cần chỉ định cụ thể và tận dụng việc phù hợp với regex nhiều hơn. Đó là các mẫu nguồn gốc được cho phép, nơi bạn có thể thêm regex để kiểm tra nguồn gốc của một yêu cầu và xem xem chúng có được chấp nhận hay từ chối. Mặc định, đó là một mảng rỗng, vì bạn sẽ muốn cẩn thận ở đây.
'allowed_origins_patterns' => [],
Headers
Bạn có thể linh hoạt trong việc đặt các tiêu chí nghiêm ngặt hoặc linh hoạt với tiêu đề khi cấu hình CORS. Phần cấu hình này cho phép bạn đặt các tiêu đề nào được phép từ nguồn gốc của bên thứ ba khi một yêu cầu được gửi đến. Hãy nói bạn muốn rất cụ thể để các bên bên ngoài chỉ có thể yêu cầu các loại nội dung cụ thể hoặc bắt buộc chấp nhận các loại nội dung cụ thể. Đây không phải là trường hợp thường gặp nhưng là một ví dụ tốt. Trong một số API, đặc biệt là vài năm trước – tôi đã thêm middleware ứng dụng để kiểm tra xem chúng có chấp nhận JSON hay không và từ chối yêu cầu với cảnh báo nếu không. Chúng ta có thể làm điều tương tự ở đây – nhưng chỉ áp dụng cho bên thứ ba. Mặc định trong Laravel có vẻ như sau:
'allowed_headers' => ['*'],
Exposing Headers
Dành riêng cho phần tiết lộ tiêu đề, đây là một tình huống thú vị. Có thể rằng bạn sẽ không cần nó – nhưng nếu bạn cần, việc tìm hiểu rõ ràng sẽ mất rất nhiều thời gian! Cấu hình mặc định có dạng như sau:
'exposed_headers' => [],
Để hiểu cần thêm gì ở đây, nếu bạn cần, bạn cần hiểu điều gì hoặc ai đang tích hợp với bạn. Thông thường, các vấn đề CORS ở đây liên quan đến các quy tắc trình duyệt về CORS và yêu cầu CORS, trong đó các tiêu đề bị loại bỏ vì được coi là không an toàn. Giả sử bạn có các tiêu đề không mặc định như: X-VAPOR-ENCODE hoặc X-GITHUB-ID hoặc một cái gì đó tương tự, mặc định các tiêu đề này sẽ bị loại bỏ trong các yêu cầu CORS, điều này có thể gây ra những tác động phụ không đáng ý mà bạn không nhận ra.
Max Age
Chúng ta có thể cấu hình thời gian mà khách hàng có thể lưu trữ tài nguyên trong bộ nhớ cache bằng cách sử dụng tùy chọn này trong cấu hình CORS.
'max_age' => 0,
Theo mặc định, chúng tôi đang cấu hình điều này để khách hàng không lưu trữ bất kỳ thông tin gì từ ứng dụng của chúng tôi. Tuy nhiên, điều này là linh hoạt, chỉ có các tích hợp như trình duyệt sẽ tôn trọng đầy đủ điều này.
Credentials
Cuối cùng, chúng ta có tùy chọn hỗ trợ thông tin xác thực (credentials). Tùy chọn này, theo mặc định, được đặt là false:
'supports_credentials' => false,
Những gì chúng ta đang cấu hình ở đây là, chúng ta có muốn cho phép xác thực từ các nguồn gốc bên thứ ba hay không. Điều này là điều cần cân nhắc rất kỹ vì nếu bạn đặt giá trị này là true, mọi người có thể đăng nhập và nhận lại chi tiết xác thực. Nếu chúng ta đặt giá trị này là true, bạn sẽ mở cửa cho các cuộc tấn công lừa đảo tiềm năng đối với người dùng của mình, điều này có thể gây ra các vấn đề tiềm tàng. Nếu bạn phải đặt giá trị này là true, hãy đảm bảo rằng các tùy chọn khác là chính xác để bạn có thể kiểm soát ai có thể thực hiện điều này. Điều cuối cùng bạn muốn là cho phép tất cả các yêu cầu từ bất kỳ nguồn gốc nào hỗ trợ thông tin xác thực!
Đây chỉ là một hướng dẫn qua về việc cấu hình và ý nghĩa của từng tùy chọn đối với bạn và ứng dụng của bạn. Luôn đảm bảo bạn cẩn thận khi cấu hình cài đặt và quy tắc CORS vì bạn không muốn mở cửa cho bất kỳ cuộc tấn công tiềm tàng nào đối với chính mình và, theo đó, người dùng của bạn do cấu hình sai.