ValidateAntiForgeryToken วัตถุประสงค์คำอธิบายและตัวอย่าง


310

คุณช่วยอธิบายวัตถุประสงค์ValidateAntiForgeryTokenและแสดงตัวอย่างเกี่ยวกับValidateAntiForgeryTokenใน MVC 4 ได้ไหม

ฉันไม่พบตัวอย่างที่อธิบายคุณลักษณะนี้หรือไม่


8
ตรวจสอบโพสต์นี้proudparrot.com/blog/archive/2012/7/…
VJAI

1
โดยวิธีการที่ฉันไม่เข้าใจจริงๆว่าทำไม MS ไม่ได้ทำให้เป็นไปได้ที่จะใส่สิทธินี้เข้าไปใน.BeginFormผู้ช่วย ดังนั้นสิ่งนี้จะมีโดยอัตโนมัติเช่นเดียวกับใน Rails
jazzcat

คำตอบ:


350

การสนับสนุนการป้องกันการปลอมแปลงของ MVC เขียนค่าที่ไม่ซ้ำกับคุกกี้ HTTP-only จากนั้นค่าเดียวกันจะถูกเขียนลงในแบบฟอร์ม เมื่อส่งหน้าแล้วจะเกิดข้อผิดพลาดหากค่าคุกกี้ไม่ตรงกับค่าของแบบฟอร์ม

มันเป็นสิ่งสำคัญที่จะทราบว่าป้องกันคุณลักษณะข้ามไซต์ปลอมคำขอ นั่นคือรูปแบบจากเว็บไซต์อื่นที่โพสต์ไปยังเว็บไซต์ของคุณในความพยายามที่จะส่งเนื้อหาที่ซ่อนอยู่โดยใช้ข้อมูลประจำตัวของผู้ใช้รับรองความถูกต้อง การโจมตีเกี่ยวข้องกับการหลอกให้ผู้ใช้ที่เข้าสู่ระบบในการส่งแบบฟอร์มหรือโดยการเรียกโปรแกรมโดยอัตโนมัติเมื่อหน้าโหลด

คุณลักษณะนี้ไม่ได้ป้องกันการปลอมแปลงข้อมูลประเภทอื่นหรือการโจมตีโดยการดัดแปลง

หากต้องการใช้ให้ตกแต่งวิธีการกระทำหรือตัวควบคุมด้วยแอValidateAntiForgeryTokenททริบิวต์และโทรออกไป@Html.AntiForgeryToken()ในแบบฟอร์มที่โพสต์ไปที่เมธอด


5
@ Chris มันทั้งคู่ ตามคำตอบของฉัน: "เขียนค่าที่ไม่ซ้ำกับคุกกี้ HTTP-only จากนั้นค่าเดียวกันจะถูกเขียนลงในแบบฟอร์ม "
Richard Szalay

21
เหตุใดจึงไม่ตั้งค่านี้เป็นค่าเริ่มต้น
Christian Hagelid

12
@ คริสเตียนเพราะไม่ใช่ Ruby on Rails ;-)
Martin Capodici

6
ดูเหมือนว่ารูปแบบ __RequestVerificationToken และคุกกี้ __RequestVerificationToken นั้นไม่เหมือนกันพวกมันทำงานเป็นคู่
WaiKit Kung

5
@rdans ไม่เลย CORS และ CSRF นั้นแตกต่างกันอย่างสิ้นเชิง CORS สำหรับการอนุญาตให้โดเมนอื่น ๆ เข้าถึง API บนเซิร์ฟเวอร์ของคุณ CSRF นั้นเกี่ยวกับการทำให้แน่ใจว่ามีการโพสต์ฟอร์มจากหน้าเว็บที่คุณคาดไว้
Richard Szalay

52

วัตถุประสงค์พื้นฐานของแอตทริบิวต์ ValidateAntiForgeryToken คือการป้องกันการโจมตีปลอมแปลงคำขอข้ามไซต์

การปลอมแปลงคำขอข้ามไซต์เป็นการโจมตีที่องค์ประกอบสคริปต์ที่เป็นอันตรายคำสั่งที่เป็นอันตรายหรือรหัสถูกส่งจากเบราว์เซอร์ของผู้ใช้ที่เชื่อถือได้ สำหรับข้อมูลเพิ่มเติมกรุณาเยี่ยมชมได้ที่นี้ http://www.asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages

มันใช้ง่ายคุณต้องตกแต่งวิธีด้วยแอตทริบิวต์ ValidateAntiForgeryToken ดังนี้

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

มันมาจาก System.Web.Mvc namespace

และในมุมมองของคุณเพิ่มรหัสนี้เพื่อเพิ่มโทเค็นเพื่อใช้ในการตรวจสอบแบบฟอร์มเมื่อส่ง

@Html.AntiForgeryToken()

ใช่คุณถูกต้องคุณต้องโทร @ Html.AntiForgeryToken () จากแบบฟอร์มของคุณและเพิ่ม ValidateAntiForgeryTokenAttribute ให้กับวิธีการดำเนินการที่คุณต้องการปกป้อง
Chandra Malla

ขอบคุณสำหรับคำตอบที่เข้าใจง่าย :)
noobprogrammer

4

ในโทเค็นการป้องกันการปลอมแปลงของ ASP.Net Core จะถูกเพิ่มลงในแบบฟอร์มโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องเพิ่ม@Html.AntiForgeryToken()ถ้าคุณใช้องค์ประกอบของฟอร์มมีดโกนหรือถ้าคุณใช้ IHtmlHelper.BeginForm และหากวิธีการของฟอร์มนั้นไม่ใช่ GET

มันจะสร้างองค์ประกอบการป้อนข้อมูลสำหรับแบบฟอร์มของคุณเช่นนี้ <input name="__RequestVerificationToken" type="hidden" value="CfDJ8HSQ_cdnkvBPo-jales205VCq9ISkg9BilG0VXAiNm3Fl5Lyu_JGpQDA4_CLNvty28w43AL8zjeR86fNALdsR3queTfAogif9ut-Zd-fwo8SAYuT0wmZ5eZUYClvpLfYm4LLIVy6VllbD54UxJ8W6FA">

และเมื่อผู้ใช้ส่งแบบฟอร์มโทเค็นนี้จะถูกตรวจสอบทางฝั่งเซิร์ฟเวอร์หากเปิดใช้งานการตรวจสอบความถูกต้อง

[ValidateAntiForgeryToken]คุณลักษณะสามารถใช้กับการกระทำ คำขอที่มีต่อการกระทำที่นำตัวกรองนี้ไปใช้จะถูกบล็อกเว้นแต่คำขอจะมีโทเค็น antiforgery ที่ถูกต้อง

[AutoValidateAntiforgeryToken]คุณลักษณะสามารถใช้กับตัวควบคุม คุณลักษณะนี้ทำงานเหมือนกับแอตทริบิวต์ ValidateAntiForgeryToken ยกเว้นว่าไม่ต้องใช้โทเค็นสำหรับคำขอที่ทำโดยใช้วิธีการ HTTP ต่อไปนี้: GET HEAD OPTIONS TRACE

ข้อมูลเพิ่มเติม: https://docs.microsoft.com/pl-pl/aspnet/core/security/anti-request-forgery


2

Microsoft มอบฟังก์ชันการทำงานในตัวที่เราใช้ในแอปพลิเคชันของเราเพื่อความปลอดภัยดังนั้นจึงไม่มีใครสามารถแฮ็คไซต์ของเราหรือบุกรุกข้อมูลสำคัญบางอย่างได้

จากวัตถุประสงค์ของ ValidateAntiForgeryToken ในแอปพลิเคชั่น MVCโดย Harpreet Singh:

ใช้ ValidateAntiForgeryToken

ลองทำตัวอย่างง่ายๆเพื่อทำความเข้าใจแนวคิดนี้ ฉันไม่ต้องการทำให้มันซับซ้อนเกินไปนั่นเป็นเหตุผลที่ฉันจะใช้เทมเพลตของแอปพลิเคชัน MVC ที่มีอยู่ใน Visual Studio แล้ว เราจะทำตามขั้นตอนนี้ เริ่มกันเลย.

  1. ขั้นตอนที่ 1 - สร้างแอปพลิเคชัน MVC สองรายการที่มีแม่แบบอินเทอร์เน็ตเริ่มต้นและตั้งชื่อเหล่านั้นเป็น CrossSite_RequestForgery และ Attack_Application ตามลำดับ

  2. ตอนนี้เปิด Web Config ของแอปพลิเคชัน CrossSite_RequestForgery และเปลี่ยนสตริงการเชื่อมต่อด้วยค่าที่ระบุด้านล่างแล้วบันทึก

`

<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF;
Integrated Security=true;" providerName="System.Data.SqlClient" /> 
 </connectionStrings>
  1. ตอนนี้คลิกที่ Tools >> NuGet Package Manager จากนั้นคลิก Package Manager Console

  2. ตอนนี้ให้รันคำสั่งสามข้อที่ระบุไว้ด้านล่างใน Package Manager Console เพื่อสร้างฐานข้อมูล

Enable-Migrations add-migration ก่อนปรับปรุงฐานข้อมูล

หมายเหตุสำคัญ - ฉันได้สร้างฐานข้อมูลด้วยรหัสวิธีแรกเพราะฉันต้องการให้ตัวอย่างนี้ในวิธีการทำงานของนักพัฒนา คุณสามารถสร้างฐานข้อมูลด้วยตนเอง มันเป็นทางเลือกของคุณ

  1. ตอนนี้เปิดตัวควบคุมบัญชี ที่นี่คุณจะเห็นวิธีการลงทะเบียนซึ่งเป็นประเภทการโพสต์ เหนือวิธีนี้ควรมีแอตทริบิวต์ที่ใช้เป็น [ValidateAntiForgeryToken] แสดงความคิดเห็นคุณลักษณะนี้ ตอนนี้คลิกขวาที่ลงทะเบียนแล้วคลิกไปที่ดู ที่นั่นอีกครั้งคุณจะพบผู้ช่วย html เป็น @ Html.AntiForgeryToken () แสดงความคิดเห็นอันนี้ด้วย เรียกใช้แอปพลิเคชันและคลิกที่ปุ่มลงทะเบียน URL จะเปิดเป็น:

http: // localhost: 52269 / บัญชี / สมัครสมาชิก

หมายเหตุ - ฉันรู้แล้วว่าคำถามที่ถูกหยิบยกขึ้นมาในใจของผู้อ่านทุกคนคือสาเหตุที่ผู้ช่วยทั้งสองนี้จำเป็นต้องได้รับการแสดงความคิดเห็นเนื่องจากทุกคนรู้ว่าสิ่งเหล่านี้ใช้เพื่อตรวจสอบคำขอ จากนั้นฉันแค่อยากให้คุณทุกคนรู้ว่านี่เป็นเพียงเพราะฉันต้องการแสดงความแตกต่างหลังจากและก่อนที่จะใช้ผู้ช่วยเหลือเหล่านี้

  1. ตอนนี้ให้เปิดแอปพลิเคชั่นที่สองที่ชื่อว่า Attack_Application จากนั้นเปิดวิธีการลงทะเบียนของตัวควบคุมบัญชี เพียงแค่เปลี่ยนวิธีการ POST ด้วยวิธีง่าย ๆ ดังแสดงด้านล่าง

    แบบฟอร์มลงทะเบียน
    1. @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
    2. @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
    3. @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)

7. ทีนี้สมมติว่าคุณเป็นแฮกเกอร์และคุณรู้ URL จากที่ที่คุณสามารถลงทะเบียนผู้ใช้ในแอปพลิเคชัน CrossSite_RequestForgery ตอนนี้คุณสร้างไซต์ปลอมแปลงเป็น Attacker_Application และใส่ URL เดียวกันในวิธีการโพสต์

8. เปิดแอปพลิเคชั่นนี้และกรอกข้อมูลลงทะเบียนและคลิกที่ลงทะเบียน คุณจะเห็นว่าคุณลงทะเบียนในแอปพลิเคชัน CrossSite_RequestForgery หากคุณตรวจสอบฐานข้อมูลของแอปพลิเคชัน CrossSite_RequestForgery คุณจะเห็นและป้อนข้อมูลที่คุณป้อน

  1. สำคัญ - ตอนนี้เปิดแอปพลิเคชัน CrossSite_RequestForgery และใส่ความเห็นโทเค็นในตัวควบคุมบัญชีและลงทะเบียนมุมมอง ลองลงทะเบียนอีกครั้งด้วยกระบวนการเดียวกัน จากนั้นข้อผิดพลาดจะเกิดขึ้นดังนี้

ผิดพลาดเซิร์ฟเวอร์ใน '/' แอพลิเคชัน. ________________________________________ คุกกี้ต่อต้านการปลอมแปลงที่จำเป็น "__RequestVerificationToken" ไม่มีอยู่

นี่คือสิ่งที่แนวคิดพูด สิ่งที่เราเพิ่มใน View ie @ Html.AntiForgeryToken () สร้าง __RequestVerificationToken ตามเวลาโหลดและ [ValidateAntiForgeryToken] มีให้ในวิธีการควบคุม ตรงกับโทเค็นนี้ในเวลาโพสต์ หากโทเค็นเหมือนกันแสดงว่านี่เป็นคำขอที่ถูกต้อง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.