ValidateAntiForgeryToken mục đích, giải thích và ví dụ


310

Bạn có thể giải thích mục đích của ValidateAntiForgeryToken và cho tôi xem ví dụ về ValidateAntiForgeryTokenMVC 4 không?

Tôi không thể tìm thấy bất kỳ ví dụ nào giải thích thuộc tính này?


8
Kiểm tra bài đăng này prideparrot.com/blog/archive/2012/7/ trên
VJAI

1
Nhân tiện, tôi thực sự không hiểu tại sao MS không thể đặt cái này ngay trong người .BeginFormtrợ giúp. Vì vậy, thứ này tự động ở đó, như trong Rails
jazzcat

Câu trả lời:


350

Hỗ trợ chống giả mạo của MVC ghi một giá trị duy nhất vào cookie chỉ có HTTP và sau đó cùng một giá trị được ghi vào biểu mẫu. Khi trang được gửi, một lỗi sẽ xuất hiện nếu giá trị cookie không khớp với giá trị của biểu mẫu.

Điều quan trọng cần lưu ý là tính năng này ngăn chặn các giả mạo yêu cầu trang web chéo . Đó là, một biểu mẫu từ một trang web khác đăng lên trang web của bạn trong nỗ lực gửi nội dung ẩn bằng thông tin xác thực của người dùng. Cuộc tấn công liên quan đến việc lừa người dùng đã đăng nhập gửi biểu mẫu hoặc đơn giản là kích hoạt lập trình một biểu mẫu khi tải trang.

Tính năng này không ngăn chặn bất kỳ loại tấn công giả mạo dữ liệu hoặc giả mạo nào khác.

Để sử dụng nó, trang trí phương thức hành động hoặc bộ điều khiển với ValidateAntiForgeryTokenthuộc tính và thực hiện cuộc gọi đến @Html.AntiForgeryToken()trong các biểu mẫu gửi đến phương thức.


5
@Chris Đó là cả hai. Theo câu trả lời của tôi: "ghi một giá trị duy nhất vào cookie chỉ có HTTP và sau đó giá trị tương tự được ghi vào biểu mẫu "
Richard Szalay

21
Tại sao điều này không được đặt mặc định?
Christian Hagelid

12
@Christian vì nó không phải là Ruby on Rails. ;-)
Martin Capodici

6
Có vẻ như biểu mẫu __RequestVerifyingToken và cookie __RequestVerifyingToken không giống nhau, chúng hoạt động như một cặp.
WaiKit Kung

5
@rdans Hoàn toàn không, CORS và CSRF hoàn toàn khác nhau. CORS là để cho phép các tên miền khác truy cập API trên máy chủ của bạn, CSRF là về việc đảm bảo rằng một bài đăng mẫu đến từ trang mà bạn mong đợi.
Richard Szalay

52

Mục đích cơ bản của thuộc tính ValidateAntiForgeryToken là để ngăn chặn các cuộc tấn công giả mạo yêu cầu trên nhiều trang web.

Giả mạo yêu cầu trên nhiều trang web là một cuộc tấn công trong đó phần tử tập lệnh độc hại, lệnh độc hại hoặc mã được gửi từ trình duyệt của người dùng đáng tin cậy. Để biết thêm thông tin về điều này, vui lòng truy cập http://www.asp.net/mvc/overview/security/xsrfcsrf-prevent-in-aspnet-mvc-and-web-pages .

Cách sử dụng rất đơn giản, bạn cần trang trí phương thức với thuộc tính ValidateAntiForgeryToken như sau:

[HttpPost]  
[ValidateAntiForgeryToken]  
public ActionResult CreateProduct(Product product)  
{
  if (ModelState.IsValid)  
  {
    //your logic 
  }
  return View(ModelName);
}

Nó có nguồn gốc từ không gian tên System.Web.Mvc.

Và theo quan điểm của bạn, hãy thêm mã này để thêm mã thông báo để nó được sử dụng để xác thực biểu mẫu khi gửi.

@Html.AntiForgeryToken()

Có, bạn đã đúng, bạn cần gọi @ Html.AntiForgeryToken () từ biểu mẫu của bạn và thêm ValidateAntiForgeryTokenAttribution vào phương thức hành động mà bạn muốn bảo vệ.
Chandra Malla

Cảm ơn vì câu trả lời đơn giản này để hiểu :)
noobprogrammer

4

Trong ASP.Net Core mã thông báo chống giả mạo được tự động thêm vào biểu mẫu, vì vậy bạn không cần thêm @Html.AntiForgeryToken()nếu bạn sử dụng phần tử biểu mẫu dao cạo hoặc nếu bạn sử dụng IHtmlHelper.BeginForm và nếu phương thức của biểu mẫu không NHẬN.

Nó sẽ tạo thành phần đầu vào cho biểu mẫu của bạn tương tự như sau: <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

Và khi người dùng gửi biểu mẫu, mã thông báo này được xác minh ở phía máy chủ nếu bật xác thực.

[ValidateAntiForgeryToken]thuộc tính có thể được sử dụng chống lại hành động. Các yêu cầu được thực hiện cho các hành động áp dụng bộ lọc này sẽ bị chặn trừ khi yêu cầu bao gồm mã thông báo chống phân tách hợp lệ.

[AutoValidateAntiforgeryToken]thuộc tính có thể được sử dụng chống lại bộ điều khiển. Thuộc tính này hoạt động giống hệt với thuộc tính ValidateAntiForgeryToken, ngoại trừ việc nó không yêu cầu mã thông báo cho các yêu cầu được thực hiện bằng các phương thức HTTP sau: GET HEAD OPTIONS TRACE

Thông tin bổ sung: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft cung cấp cho chúng tôi chức năng tích hợp mà chúng tôi sử dụng trong ứng dụng của mình cho mục đích bảo mật, vì vậy không ai có thể hack trang web của chúng tôi hoặc xâm chiếm một số thông tin quan trọng.

Từ mục đích hợp lệAntiForgeryToken trong ứng dụng MVC của Harpreet Singh:

Sử dụng ValidateAntiForgeryToken

Hãy thử với một ví dụ đơn giản để hiểu khái niệm này. Tôi không muốn làm cho nó quá phức tạp, đó là lý do tại sao tôi sẽ sử dụng một mẫu của một ứng dụng MVC, đã có sẵn trong Visual Studio. Chúng tôi sẽ làm điều này từng bước. Hãy bắt đầu.

  1. Bước 1 - Tạo hai ứng dụng MVC với mẫu internet mặc định và đặt các tên đó lần lượt là CrossSite_RequestForgery và Attack_Application.

  2. Bây giờ, hãy mở Cấu hình Web của ứng dụng CrossSite_RequestForgery và thay đổi chuỗi kết nối với chuỗi được cung cấp bên dưới và sau đó lưu lại.

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. Bây giờ, nhấp vào Công cụ >> Trình quản lý gói NuGet, sau đó Bảng điều khiển quản lý gói

  2. Bây giờ, hãy chạy ba lệnh được đề cập dưới đây trong Gói quản lý gói để tạo cơ sở dữ liệu.

Bật-di chuyển bổ sung cơ sở dữ liệu cập nhật đầu tiên

Lưu ý quan trọng - Tôi đã tạo cơ sở dữ liệu với cách tiếp cận mã đầu tiên vì tôi muốn tạo ví dụ này theo cách các nhà phát triển làm việc. Bạn cũng có thể tạo cơ sở dữ liệu theo cách thủ công. Đó là sự lựa chọn của bạn.

  1. Bây giờ, mở Trình điều khiển tài khoản. Ở đây, bạn sẽ thấy một phương thức đăng ký có loại là bài. Trên phương thức này, cần có một thuộc tính có sẵn là [ValidateAntiForgeryToken]. Nhận xét thuộc tính này. Bây giờ, nhấp chuột phải vào đăng ký và nhấp vào Xem. Ở đó, một lần nữa, bạn sẽ tìm thấy một trình trợ giúp html là @ Html.AntiForgeryToken (). Bình luận này cũng có. Chạy ứng dụng và bấm vào nút đăng ký. URL sẽ được mở dưới dạng:

http: // localhost: 52269 / Tài khoản / Đăng ký

Lưu ý - Bây giờ tôi biết câu hỏi đang được nêu ra trong đầu mọi người đọc là tại sao hai người trợ giúp này cần được bình luận, vì mọi người đều biết những câu hỏi này được sử dụng để xác thực yêu cầu. Sau đó, tôi chỉ muốn cho tất cả các bạn biết rằng đây chỉ là vì tôi muốn thể hiện sự khác biệt sau và trước khi áp dụng những người trợ giúp này.

  1. Bây giờ, hãy mở ứng dụng thứ hai là Attack_Application. Sau đó, mở phương thức Đăng ký của Trình điều khiển tài khoản. Chỉ cần thay đổi phương thức POST bằng cách đơn giản, hiển thị bên dưới.

    Mẫu đăng ký
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html. Nhãn hiệu (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. Bây giờ, giả sử bạn là một hacker và bạn biết URL từ nơi bạn có thể đăng ký người dùng trong ứng dụng CrossSite_RequestForgery. Bây giờ, bạn đã tạo một trang web Giả mạo là Attacker_Application và chỉ cần đặt cùng một URL trong phương thức đăng bài.

8. Chạy ứng dụng này ngay bây giờ và điền vào các trường đăng ký và nhấp vào đăng ký. Bạn sẽ thấy bạn được đăng ký trong ứng dụng CrossSite_RequestForgery. Nếu bạn kiểm tra cơ sở dữ liệu của ứng dụng CrossSite_RequestForgery thì bạn sẽ thấy và nhập bạn đã nhập.

  1. Quan trọng - Bây giờ, hãy mở ứng dụng CrossSite_RequestForgery và nhận xét mã thông báo trong Trình điều khiển tài khoản và đăng ký Xem. Hãy thử đăng ký lại với quá trình tương tự. Sau đó, một lỗi sẽ xảy ra như dưới đây.

lỗi server trong ứng dụng '/' Không được sử dụng cookie chống giả mạo "__RequestVerifyingToken".

Đây là những gì khái niệm nói. Những gì chúng tôi thêm vào Xem tức là @ Html.AntiForgeryToken () tạo __RequestVerifyingToken về thời gian tải và [ValidateAntiForgeryToken] có sẵn trên phương thức Bộ điều khiển. Phù hợp với mã thông báo này vào thời gian đăng bài. Nếu mã thông báo là như nhau, thì có nghĩa đây là một yêu cầu hợp lệ.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.