คุณช่วยอธิบายวัตถุประสงค์ValidateAntiForgeryTokenและแสดงตัวอย่างเกี่ยวกับValidateAntiForgeryToken
ใน MVC 4 ได้ไหม
ฉันไม่พบตัวอย่างที่อธิบายคุณลักษณะนี้หรือไม่
.BeginForm
ผู้ช่วย ดังนั้นสิ่งนี้จะมีโดยอัตโนมัติเช่นเดียวกับใน Rails
คุณช่วยอธิบายวัตถุประสงค์ValidateAntiForgeryTokenและแสดงตัวอย่างเกี่ยวกับValidateAntiForgeryToken
ใน MVC 4 ได้ไหม
ฉันไม่พบตัวอย่างที่อธิบายคุณลักษณะนี้หรือไม่
.BeginForm
ผู้ช่วย ดังนั้นสิ่งนี้จะมีโดยอัตโนมัติเช่นเดียวกับใน Rails
คำตอบ:
การสนับสนุนการป้องกันการปลอมแปลงของ MVC เขียนค่าที่ไม่ซ้ำกับคุกกี้ HTTP-only จากนั้นค่าเดียวกันจะถูกเขียนลงในแบบฟอร์ม เมื่อส่งหน้าแล้วจะเกิดข้อผิดพลาดหากค่าคุกกี้ไม่ตรงกับค่าของแบบฟอร์ม
มันเป็นสิ่งสำคัญที่จะทราบว่าป้องกันคุณลักษณะข้ามไซต์ปลอมคำขอ นั่นคือรูปแบบจากเว็บไซต์อื่นที่โพสต์ไปยังเว็บไซต์ของคุณในความพยายามที่จะส่งเนื้อหาที่ซ่อนอยู่โดยใช้ข้อมูลประจำตัวของผู้ใช้รับรองความถูกต้อง การโจมตีเกี่ยวข้องกับการหลอกให้ผู้ใช้ที่เข้าสู่ระบบในการส่งแบบฟอร์มหรือโดยการเรียกโปรแกรมโดยอัตโนมัติเมื่อหน้าโหลด
คุณลักษณะนี้ไม่ได้ป้องกันการปลอมแปลงข้อมูลประเภทอื่นหรือการโจมตีโดยการดัดแปลง
หากต้องการใช้ให้ตกแต่งวิธีการกระทำหรือตัวควบคุมด้วยแอValidateAntiForgeryToken
ททริบิวต์และโทรออกไป@Html.AntiForgeryToken()
ในแบบฟอร์มที่โพสต์ไปที่เมธอด
วัตถุประสงค์พื้นฐานของแอตทริบิวต์ 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()
ในโทเค็นการป้องกันการปลอมแปลงของ 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
Microsoft มอบฟังก์ชันการทำงานในตัวที่เราใช้ในแอปพลิเคชันของเราเพื่อความปลอดภัยดังนั้นจึงไม่มีใครสามารถแฮ็คไซต์ของเราหรือบุกรุกข้อมูลสำคัญบางอย่างได้
จากวัตถุประสงค์ของ ValidateAntiForgeryToken ในแอปพลิเคชั่น MVCโดย Harpreet Singh:
ใช้ ValidateAntiForgeryToken
ลองทำตัวอย่างง่ายๆเพื่อทำความเข้าใจแนวคิดนี้ ฉันไม่ต้องการทำให้มันซับซ้อนเกินไปนั่นเป็นเหตุผลที่ฉันจะใช้เทมเพลตของแอปพลิเคชัน MVC ที่มีอยู่ใน Visual Studio แล้ว เราจะทำตามขั้นตอนนี้ เริ่มกันเลย.
ขั้นตอนที่ 1 - สร้างแอปพลิเคชัน MVC สองรายการที่มีแม่แบบอินเทอร์เน็ตเริ่มต้นและตั้งชื่อเหล่านั้นเป็น CrossSite_RequestForgery และ Attack_Application ตามลำดับ
ตอนนี้เปิด Web Config ของแอปพลิเคชัน CrossSite_RequestForgery และเปลี่ยนสตริงการเชื่อมต่อด้วยค่าที่ระบุด้านล่างแล้วบันทึก
`
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=local\SQLEXPRESS;Initial Catalog=CSRF; Integrated Security=true;" providerName="System.Data.SqlClient" /> </connectionStrings>
ตอนนี้คลิกที่ Tools >> NuGet Package Manager จากนั้นคลิก Package Manager Console
ตอนนี้ให้รันคำสั่งสามข้อที่ระบุไว้ด้านล่างใน Package Manager Console เพื่อสร้างฐานข้อมูล
Enable-Migrations add-migration ก่อนปรับปรุงฐานข้อมูล
หมายเหตุสำคัญ - ฉันได้สร้างฐานข้อมูลด้วยรหัสวิธีแรกเพราะฉันต้องการให้ตัวอย่างนี้ในวิธีการทำงานของนักพัฒนา คุณสามารถสร้างฐานข้อมูลด้วยตนเอง มันเป็นทางเลือกของคุณ
- ตอนนี้เปิดตัวควบคุมบัญชี ที่นี่คุณจะเห็นวิธีการลงทะเบียนซึ่งเป็นประเภทการโพสต์ เหนือวิธีนี้ควรมีแอตทริบิวต์ที่ใช้เป็น [ValidateAntiForgeryToken] แสดงความคิดเห็นคุณลักษณะนี้ ตอนนี้คลิกขวาที่ลงทะเบียนแล้วคลิกไปที่ดู ที่นั่นอีกครั้งคุณจะพบผู้ช่วย html เป็น @ Html.AntiForgeryToken () แสดงความคิดเห็นอันนี้ด้วย เรียกใช้แอปพลิเคชันและคลิกที่ปุ่มลงทะเบียน URL จะเปิดเป็น:
http: // localhost: 52269 / บัญชี / สมัครสมาชิก
หมายเหตุ - ฉันรู้แล้วว่าคำถามที่ถูกหยิบยกขึ้นมาในใจของผู้อ่านทุกคนคือสาเหตุที่ผู้ช่วยทั้งสองนี้จำเป็นต้องได้รับการแสดงความคิดเห็นเนื่องจากทุกคนรู้ว่าสิ่งเหล่านี้ใช้เพื่อตรวจสอบคำขอ จากนั้นฉันแค่อยากให้คุณทุกคนรู้ว่านี่เป็นเพียงเพราะฉันต้องการแสดงความแตกต่างหลังจากและก่อนที่จะใช้ผู้ช่วยเหลือเหล่านี้
ตอนนี้ให้เปิดแอปพลิเคชั่นที่สองที่ชื่อว่า Attack_Application จากนั้นเปิดวิธีการลงทะเบียนของตัวควบคุมบัญชี เพียงแค่เปลี่ยนวิธีการ POST ด้วยวิธีง่าย ๆ ดังแสดงด้านล่าง
แบบฟอร์มลงทะเบียน
- @ Html.LabelFor (m => m.UserName) @ Html.TextBoxFor (m => m.UserName)
- @ Html.LabelFor (m => m.Password) @ Html.PasswordFor (m => m.Password)
- @ Html.LabelFor (m => m.ConfirmPassword) @ Html.PasswordFor (m => m.ConfirmPassword)
7. ทีนี้สมมติว่าคุณเป็นแฮกเกอร์และคุณรู้ URL จากที่ที่คุณสามารถลงทะเบียนผู้ใช้ในแอปพลิเคชัน CrossSite_RequestForgery ตอนนี้คุณสร้างไซต์ปลอมแปลงเป็น Attacker_Application และใส่ URL เดียวกันในวิธีการโพสต์
8. เปิดแอปพลิเคชั่นนี้และกรอกข้อมูลลงทะเบียนและคลิกที่ลงทะเบียน คุณจะเห็นว่าคุณลงทะเบียนในแอปพลิเคชัน CrossSite_RequestForgery หากคุณตรวจสอบฐานข้อมูลของแอปพลิเคชัน CrossSite_RequestForgery คุณจะเห็นและป้อนข้อมูลที่คุณป้อน
- สำคัญ - ตอนนี้เปิดแอปพลิเคชัน CrossSite_RequestForgery และใส่ความเห็นโทเค็นในตัวควบคุมบัญชีและลงทะเบียนมุมมอง ลองลงทะเบียนอีกครั้งด้วยกระบวนการเดียวกัน จากนั้นข้อผิดพลาดจะเกิดขึ้นดังนี้
ผิดพลาดเซิร์ฟเวอร์ใน '/' แอพลิเคชัน. ________________________________________ คุกกี้ต่อต้านการปลอมแปลงที่จำเป็น "__RequestVerificationToken" ไม่มีอยู่
นี่คือสิ่งที่แนวคิดพูด สิ่งที่เราเพิ่มใน View ie @ Html.AntiForgeryToken () สร้าง __RequestVerificationToken ตามเวลาโหลดและ [ValidateAntiForgeryToken] มีให้ในวิธีการควบคุม ตรงกับโทเค็นนี้ในเวลาโพสต์ หากโทเค็นเหมือนกันแสดงว่านี่เป็นคำขอที่ถูกต้อง