การตอบสนองที่แข็งแกร่ง html รูปร่างบ้า ที่อยู่อีเมล

การโจมตีด้วยการแทรกสคริปต์ข้ามไซต์

ในการโจมตีด้วยสคริปต์ข้ามไซต์ (XSS) ผู้โจมตีจะแทรกโค้ดที่เป็นอันตรายลงในเว็บเพจที่ถูกต้อง จากนั้นจึงเรียกใช้สคริปต์ที่เป็นอันตรายบนฝั่งไคลเอ็นต์ เมื่อผู้ใช้เยี่ยมชมเพจที่ติดไวรัส สคริปต์จะถูกดาวน์โหลดไปยังเบราว์เซอร์ของผู้ใช้และดำเนินการที่นั่น โครงการนี้มีหลายพันธุ์ สคริปต์ที่เป็นอันตรายสามารถเข้าถึงคุกกี้ของเบราว์เซอร์ โทเค็นเซสชัน หรือข้อมูลที่ละเอียดอ่อนอื่น ๆ ที่จัดเก็บไว้ในเบราว์เซอร์ อย่างไรก็ตาม การโจมตีทั้งหมดจะดำเนินการตามรูปแบบที่แสดงในรูปที่ 1

รูปที่ 1 รูปที่ 1 การโจมตี XSS ทั่วไป
ช่องโหว่ XSS

ในการโจมตี XSS โดยทั่วไป ผู้โจมตีจะค้นหาวิธีแทรกสตริงลงในเว็บเพจของเซิร์ฟเวอร์ สมมติว่าผู้โจมตีแทรกบรรทัดต่อไปนี้ลงในเว็บเพจ: alert("you are under attack") ทุกครั้งที่ผู้ใช้เยี่ยมชมหน้านี้ เบราว์เซอร์จะดาวน์โหลดสคริปต์นี้และเรียกใช้พร้อมกับเนื้อหาที่เหลือของหน้า ในกรณีนี้ จากการรันสคริปต์ ผู้ใช้จะเห็นหน้าต่างป๊อปอัปพร้อมข้อความ “คุณกำลังถูกโจมตี”

ผลที่ตามมาของ XSS

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

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

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

ตารางที่ 1 แสดงชื่อวัตถุสำหรับอักขระ HTML ทั่วไปบางตัว

ตารางที่ 1. ชื่ออ็อบเจ็กต์สำหรับอักขระ HTML ผลลัพธ์ คำอธิบาย ชื่อวัตถุ หมายเลขวัตถุ
พื้นที่ไม่แตก
< น้อยกว่า<
> มากกว่า> >
& เครื่องหมาย& &
¢ เซ็นต์¢ ¢
£ ปอนด์£ £
¥ เจน่า¥ ¥
ยูโร
§ ย่อหน้า§ §
© ลิขสิทธิ์ ©
® ® ®
เครื่องหมายการค้า

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

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

การเพิ่มโค้ด HTML ให้กับแอปพลิเคชัน Java ฝั่งเซิร์ฟเวอร์

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

รายการ 1. การแปลงอักขระเป็นชื่อวัตถุ HTML คลาสสาธารณะ EscapeUtils ( public static สุดท้าย HashMap m = new HashMap(); static ( m.put(34, """); //< - меньше чем m.put(60, ""); // >- มากกว่า //ผู้ใช้ต้องตรงกันทั้งหมด วัตถุ HTMLด้วยค่าทศนิยมที่สอดคล้องกัน //การแมปวัตถุกับค่าทศนิยมแสดงในตารางด้านล่าง) public static String EscapeHtml() ( String str = "alert(\"abc\")"; try ( StringWriterwriter = new StringWriter((int) (str .length() * 1.5)); Escape(writer, str); System.out.println("encoded string is " +writer.toString()); returnwriter.toString(); ) catch (IOException ioe) ( ioe .printStackTrace() ; return null; ) ) public static void Escape(ผู้เขียนนักเขียน, String str) พ่น IOException ( int len ​​​​= str.length(); for (int i = 0; i< len; i++) { char c = str.charAt(i); int ascii = (int) c; String entityName = (String) m.get(ascii); if (entityName == null) { if (c >0x7F) (writer.write("");writer.write(Integer.toString(c, 10));writer.write(";"); ) else (writer.write(c); ) ) else (writer. เขียน (ชื่อเอนทิตี); ) ) ) )

รหัส Java ในรายการ 1 เข้ารหัสสตริง HTML String String "alert(\"abc\)" ใช้ขั้นตอนต่อไปนี้:

ด้วยเหตุนี้ บรรทัดต่อไปนี้จะปรากฏในเอาต์พุต: alert("abc")

ตารางที่ 2 แสดงการจับคู่วัตถุ HTML กับค่าทศนิยม

ตารางที่ 2. ค่าทศนิยมของวัตถุ HTML ค่าทศนิยม วัตถุ คำอธิบาย
160 พื้นที่ไม่แตก
60 < น้อยกว่า
62 > มากกว่า
38 & เครื่องหมาย
162 ¢ เซ็นต์
163 £ ปอนด์
165 ¥ เจน่า
8364 ยูโร
167 § ย่อหน้า
169 ลิขสิทธิ์
174 ® เครื่องหมายการค้าจดทะเบียน
8482 เครื่องหมายการค้า
บทสรุป

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

การสร้างการตอบสนองจากผู้ควบคุม

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

ตัวอย่างเช่น หากต้องการส่งการตอบกลับ HTML คุณจะต้องสร้างและเขียนข้อมูล HTML จากนั้นส่งไปยังไคลเอนต์โดยใช้เมธอด Response.Write() ในทำนองเดียวกัน หากต้องการเปลี่ยนเส้นทางเบราว์เซอร์ของผู้ใช้ไปยัง URL อื่น คุณจะต้องเรียกใช้เมธอด Response.Redirect() และส่งผ่าน URL ที่ต้องการ ทั้งสองวิธีแสดงให้เห็นในโค้ดด้านล่าง ซึ่งแสดงส่วนขยายของคลาส BasicController ที่เราสร้างขึ้นในบทความก่อนหน้านี้โดยการใช้อินเทอร์เฟซ IController:

ใช้ System.Web.Mvc; โดยใช้ System.Web.Routing; Namespace ControllersAndActions.Controllers (คลาสสาธารณะ BasicController: IController ( public void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller) : (0), วิธีการดำเนินการ: (1)", ตัวควบคุม, การกระทำ)); ) ) ) )

วิธีการเดียวกันนี้สามารถนำไปใช้ในกรณีที่สืบทอดคอนโทรลเลอร์จากคลาสคอนโทรลเลอร์ คลาส HttpResponseBase ซึ่งส่งคืนเมื่อคุณสมบัติ requestContext.HttpContext.Response ถูกอ่านในเมธอด Execute() สามารถเข้าถึงได้ผ่านคุณสมบัติ Controller.Response ดังที่แสดงในตัวอย่างด้านล่าง ซึ่งขยายคลาส DerivedController ที่สร้างขึ้นก่อนหน้านี้ด้วย สืบทอดมาจากคลาสคอนโทรลเลอร์:

การใช้ระบบ; ใช้ System.Web; ใช้ System.Web.Mvc; Namespace ControllersAndActions.Controllers ( คลาสสาธารณะ DerivedController: คอนโทรลเลอร์ ( สาธารณะ ActionResult Index() ( // ... ) โมฆะสาธารณะ ProduceOutput() ( ถ้า (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write ("ตัวควบคุม: ได้มา, วิธีการดำเนินการ: ProduceOutput"); ) ) )

เมธอด ProduceOutput() ใช้ค่าของคุณสมบัติ Server.MachineName เพื่อตัดสินใจว่าจะส่งการตอบสนองใดไปยังไคลเอนต์ ("ProfessorWeb" คือชื่อของเครื่องที่กำลังพัฒนาของฉัน)

แม้ว่าวิธีการสร้างการตอบสนองต่อผู้ใช้นี้จะได้ผล แต่ก็มีปัญหาหลายประการ:

    คลาสคอนโทรลเลอร์จะต้องมีข้อมูลเกี่ยวกับ โครงสร้าง HTMLหรือ URL ซึ่งทำให้คลาสอ่านและบำรุงรักษาได้ยาก

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

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

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

ผลลัพธ์ของการกระทำ

ผลลัพธ์การดำเนินการในกรอบงาน MVC ใช้เพื่อแยกข้อความแสดงเจตจำนงออกจากการดำเนินการตามเจตนา (ขออภัยที่ซ้ำซาก) แนวคิดนี้จะดูเรียบง่ายเมื่อคุณเข้าใจแล้ว แต่อาจต้องใช้เวลาพอสมควรในการทำความเข้าใจเนื่องจากมีบางอย่างทางอ้อม

แทนที่จะจัดการกับออบเจ็กต์การตอบสนองโดยตรง วิธีการกระทำจะส่งคืนออบเจ็กต์คลาสที่ได้รับจาก ActionResult ซึ่งอธิบายว่าการตอบสนองจากตัวควบคุมควรเป็นอย่างไร ตัวอย่างเช่น แสดงผลมุมมองหรือเปลี่ยนเส้นทางไปยัง URL หรือวิธีดำเนินการอื่น อย่างไรก็ตาม (นี่คือความอ้อมมาก) คำตอบไม่ได้ถูกสร้างขึ้นโดยตรง แต่วัตถุ ActionResult จะถูกสร้างขึ้นแทน ซึ่ง MVC Framework ประมวลผลเพื่อสร้างผลลัพธ์หลังจากเรียกใช้วิธีการดำเนินการแล้ว

ระบบผลลัพธ์การดำเนินการเป็นตัวอย่างของรูปแบบการออกแบบคำสั่ง รูปแบบนี้แสดงถึงสถานการณ์ที่คุณจัดเก็บและส่งวัตถุที่อธิบายการดำเนินการที่กำลังดำเนินการ

เมื่อ MVC Framework ได้รับวัตถุ ActionResult จากวิธีการดำเนินการ มันจะเรียก วิธีการ ExecuteResult()กำหนดไว้ในคลาสของวัตถุนี้ จากนั้นการนำผลลัพธ์ของการดำเนินการไปใช้จะดำเนินการบนออบเจ็กต์ Response โดยสร้างผลลัพธ์ที่ตรงกับเจตนาของคุณ เพื่อสาธิตการใช้งานจริง เรามาสร้างโฟลเดอร์ Infrastructure และเพิ่มไฟล์คลาสใหม่ที่เรียกว่า CustomRedirectResult.cs พร้อมการใช้งาน ActionResult แบบกำหนดเองที่แสดงในตัวอย่างด้านล่าง:

ใช้ System.Web.Mvc; Namespace ControllersAndActions.Infrastructure (คลาสสาธารณะ CustomRedirectResult: ActionResult ( Url สตริงสาธารณะ ( get; set; ) การแทนที่สาธารณะเป็นโมฆะ ExecuteResult (บริบทของ ControllerContext) ( string fullUrl = UrlHelper.GenerateContentUrl (Url, context.HttpContext); context.HttpContext.Response.Redirect (URL เต็ม); ) ) )

คลาสนี้ขึ้นอยู่กับวิธีการทำงานของคลาส System.Web.Mvc.RedirectResult ข้อดีประการหนึ่งของ MVC Framework แบบโอเพ่นซอร์สคือความสามารถในการสำรวจการทำงานภายในของทุกสิ่ง คลาส CustomRedirectResult นั้นง่ายกว่า MVC ที่เทียบเท่ากันมาก แต่ก็เพียงพอสำหรับวัตถุประสงค์ของบทความนี้

เมื่อสร้างอินสแตนซ์คลาส RedirectResult เราจะส่ง URL ที่ควรเปลี่ยนเส้นทางผู้ใช้ไป เมธอด ExecuteResult() ซึ่งจะถูกดำเนินการโดย MVC Framework เมื่อเมธอดการดำเนินการเสร็จสมบูรณ์ จะได้รับ วัตถุตอบสนองเพื่อทำการร้องขอผ่านอ็อบเจ็กต์ ControllerContext ที่ได้รับจากเฟรมเวิร์กและเรียกใช้เมธอด RedirectPermanent() หรือเมธอด Redirect() (ซึ่งสะท้อนถึงสิ่งที่ทำภายในการใช้งาน IController ระดับต่ำในตัวอย่างก่อนหน้าในบทความ)

การใช้คลาส CustomRedirectResult แสดงในตัวอย่างด้านล่าง ซึ่งแสดงการเปลี่ยนแปลงที่เกิดขึ้นกับ Derived controller:

// ... ใช้ ControllersAndActions.Infrastructure; namespace ControllersAndActions.Controllers ( คลาสสาธารณะ DerivedController: คอนโทรลเลอร์ ( สาธารณะ ActionResult Index() ( // ... ) สาธารณะ ActionResult ProduceOutput() ( ถ้า (Server.MachineName == "MyMachineName") ส่งคืน CustomRedirectResult ใหม่ ( Url = "/Basic/ ดัชนี" ); else ( Response.Write("Controller: Derived, Action Method: ProduceOutput"); return null; ) ) ) )

โปรดทราบว่าเราถูกบังคับให้เปลี่ยนผลลัพธ์ของวิธีการดำเนินการเพื่อส่งคืน ActionResult เราจะคืนค่า null หากเราไม่ต้องการให้ MVC Framework ดำเนินการใดๆ เมื่อดำเนินการตามวิธีดำเนินการ ซึ่งเป็นสิ่งที่เราทำหากอินสแตนซ์ CustomRedirectResult ไม่ถูกส่งคืน

ตัวควบคุมการทดสอบหน่วยและการดำเนินการ

MVC Framework หลายส่วนได้รับการออกแบบมาเพื่อให้การทดสอบหน่วยง่ายขึ้น โดยเฉพาะอย่างยิ่งกับการดำเนินการและตัวควบคุม มีสาเหตุหลายประการสำหรับการสนับสนุนนี้:

คุณสามารถทดสอบการดำเนินการและตัวควบคุมภายนอกเว็บเซิร์ฟเวอร์ได้ ออบเจ็กต์บริบทเข้าถึงได้ผ่านคลาสพื้นฐาน (เช่น HttpRequestBase) ซึ่งจำลองได้ง่าย

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

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

บทความในอนาคตเกี่ยวกับการสร้างข้อมูลจากตัวควบคุมจะแสดงวิธีสร้างการทดสอบหน่วยสำหรับผลลัพธ์การดำเนินการประเภทต่างๆ

อย่าลืมว่าการทดสอบหน่วยเป็นเพียงส่วนหนึ่งของภาพเท่านั้น ลักษณะการทำงานที่ซับซ้อนในแอปพลิเคชันเกิดขึ้นเมื่อเรียกใช้วิธีดำเนินการตามลำดับ การทดสอบหน่วยจะทำงานได้ดีที่สุดเมื่อรวมกับวิธีการทดสอบอื่นๆ

ตอนนี้คุณรู้แล้วว่าผลลัพธ์พิเศษของการดำเนินการเปลี่ยนเส้นทางทำงานอย่างไร คุณสามารถเปลี่ยนไปใช้สิ่งที่เทียบเท่ากับกรอบงาน MVC ซึ่งมีประสิทธิภาพมากกว่าและได้รับการทดสอบอย่างละเอียดโดย Microsoft การเปลี่ยนแปลงที่จำเป็นใน Derived controller มีดังต่อไปนี้:

// ... สาธารณะ ActionResult ProduceOutput() ( ส่งคืน RedirectResult ใหม่ ("/Basic/Index"); ) // ...

คำสั่งแบบมีเงื่อนไขถูกลบออกจากวิธีดำเนินการแล้ว ซึ่งหมายความว่าหลังจากเรียกใช้แอปพลิเคชันและนำทางไปยัง URL เช่น /Derived/ProduceOutput เบราว์เซอร์จะถูกเปลี่ยนเส้นทางไปยัง URL เช่น /Basic/Index เพื่อลดความซับซ้อนของโค้ดวิธีดำเนินการ คลาส Controller มีวิธีอำนวยความสะดวกสำหรับการสร้างออบเจ็กต์ ActionResult ประเภทต่างๆ ตัวอย่างเช่น เราสามารถบรรลุผลแบบเดียวกับในตัวอย่างข้างต้นได้โดยการส่งคืนผลลัพธ์ของเมธอด Redirect():

// ... สาธารณะ ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...

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

กรอบงาน MVC กำหนดประเภทผลลัพธ์การดำเนินการในตัวหลายประเภท ซึ่งอธิบายไว้ในตารางด้านล่าง:

ประเภท ActionResult ในตัว พิมพ์เมธอด Description Helper ของคลาส Controller
ดูผลลัพธ์

แสดงผลเทมเพลตมุมมองที่ระบุหรือมาตรฐาน

ดู()
ผลลัพธ์มุมมองบางส่วน

แสดงผลเทมเพลตมุมมองบางส่วนที่ระบุหรือมาตรฐาน

มุมมองบางส่วน()
เปลี่ยนเส้นทางไปยังRouteResult

ปัญหา การเปลี่ยนเส้นทาง HTTP 301 หรือ 302 เป็นวิธีการดำเนินการหรือรายการเส้นทางที่ระบุ สร้าง URL ตามการกำหนดค่าเส้นทาง

เปลี่ยนเส้นทางไปยังการดำเนินการ()
เปลี่ยนเส้นทางไปยังการดำเนินการถาวร ()
เปลี่ยนเส้นทางไปยังเส้นทาง()
เปลี่ยนเส้นทางไปยังเส้นทางถาวร()
ผลลัพธ์การเปลี่ยนเส้นทาง

ออก HTTP 301 หรือ 302 เปลี่ยนเส้นทางไปยัง URL ที่กำหนด

เปลี่ยนเส้นทาง()
เปลี่ยนเส้นทางถาวร()
ผลลัพธ์ของเนื้อหา

ส่งคืนข้อมูลข้อความที่ไม่ได้จัดรูปแบบไปยังเบราว์เซอร์ โดยตั้งค่าส่วนหัวของประเภทเนื้อหาเพิ่มเติม

เนื้อหา()
ไฟล์ผลลัพธ์

ถ่ายโอนข้อมูลไบนารี (เช่น ไฟล์บนดิสก์หรืออาร์เรย์ไบต์ในหน่วยความจำ) ไปยังเบราว์เซอร์โดยตรง

ไฟล์()
JsonResult

ทำให้วัตถุ .NET เป็นอนุกรมเป็น รูปแบบ JSONและส่งเป็นการตอบกลับ การตอบสนองประเภทนี้มักถูกสร้างขึ้นเมื่อใช้เครื่องมือ Web API และ AJAX

เจสัน()
JavaScriptResult

ส่งชิ้นส่วน รหัสแหล่งที่มา JavaScript ที่ต้องดำเนินการโดยเบราว์เซอร์

จาวาสคริปต์()
ผลลัพธ์ที่ไม่ได้รับอนุญาต Http

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

เลขที่
HttpNotFoundResult

การส่งคืน ข้อผิดพลาด HTTPด้วยรหัส 404 - ไม่พบ (ไม่พบ)

HttpNotFound()
ผลลัพธ์ HttpStatusCode

ส่งคืนรหัส HTTP ที่ระบุ

เลขที่
ผลว่างเปล่า

ไม่ได้ทำอะไร

เลขที่

ประเภทเหล่านี้ทั้งหมดได้มาจากคลาส ActionResult และหลายประเภทมีวิธีการช่วยเหลือที่สะดวกในคลาส Controller เราจะสาธิตการใช้ผลลัพธ์ประเภทเหล่านี้ในบทความต่อๆ ไป

หลังจากได้รับและตีความข้อความร้องขอแล้ว เซิร์ฟเวอร์จะตอบกลับด้วยข้อความตอบกลับ HTTP:

  • บรรทัดสถานะ
  • ช่องส่วนหัวเป็นศูนย์หรือมากกว่า (ทั่วไป|การตอบสนอง|เอนทิตี) ตามด้วย CRLF
  • บรรทัดว่าง (เช่น บรรทัดที่ไม่มีสิ่งใดอยู่ข้างหน้า CRLF) ระบุจุดสิ้นสุดของฟิลด์ส่วนหัว
  • เนื้อหาข้อความหรือไม่ก็ได้
  • ส่วนต่อไปนี้แต่ละส่วนจะอธิบายเกี่ยวกับเอนทิตีที่ใช้ในข้อความตอบกลับ HTTP

    สถานะข้อความ-บรรทัด

    Status-Line ประกอบด้วยเวอร์ชันโปรโตคอลตามด้วยรหัสสถานะตัวเลขและข้อความที่เกี่ยวข้อง องค์ประกอบจะถูกคั่นด้วยอักขระ SP ช่องว่าง

Status-Line = HTTP-เวอร์ชัน SP รหัสสถานะ SP เหตุผล-วลี CRLF เวอร์ชัน HTTP

เซิร์ฟเวอร์ที่รองรับ HTTP เวอร์ชัน 1.1 จะส่งคืนข้อมูลเวอร์ชันต่อไปนี้:

HTTP-เวอร์ชัน = HTTP/1.1

รหัสสถานะ

องค์ประกอบรหัสสถานะเป็นจำนวนเต็ม 3 หลัก โดยที่หลักแรกของรหัสสถานะจะกำหนดคลาสของการตอบสนอง และตัวเลขสองหลักสุดท้ายไม่มีบทบาทในการจัดหมวดหมู่ หลักแรกมี 5 ค่า:

เอส.เอ็น. รหัสและคำอธิบาย
1 1xx: ให้ข้อมูล

หมายความว่าได้รับคำขอแล้วและกระบวนการกำลังดำเนินต่อไป

2 2xx: สำเร็จ

หมายความว่าการดำเนินการได้รับ เข้าใจ และยอมรับเรียบร้อยแล้ว

3 3xx: การเปลี่ยนเส้นทาง

หมายความว่าจะต้องดำเนินการเพิ่มเติมเพื่อดำเนินการตามคำขอให้เสร็จสิ้น

4 4xx: ข้อผิดพลาดของไคลเอ็นต์

หมายความว่าคำขอมีไวยากรณ์ที่ไม่ถูกต้องหรือไม่สามารถดำเนินการได้

5 5xx: ข้อผิดพลาดของเซิร์ฟเวอร์

หมายความว่าเซิร์ฟเวอร์ไม่สามารถตอบสนองคำขอที่ถูกต้องได้

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

ฟิลด์ส่วนหัวการตอบกลับ

เราจะศึกษา General-header และ Entity-header ในบทที่แยกต่างหาก เมื่อเราจะเรียนรู้ฟิลด์ส่วนหัว HTTP ในตอนนี้ เรามาตรวจสอบว่าฟิลด์ส่วนหัวของการตอบกลับคืออะไร

ฟิลด์ส่วนหัวการตอบกลับอนุญาตให้เซิร์ฟเวอร์ส่งข้อมูลเพิ่มเติมเกี่ยวกับการตอบกลับที่ไม่สามารถวางในบรรทัดสถานะ ฟิลด์ส่วนหัวเหล่านี้ให้ข้อมูลเกี่ยวกับเซิร์ฟเวอร์และการเข้าถึงทรัพยากรเพิ่มเติมที่ระบุโดย Request-URI

  • พร็อกซี-รับรองความถูกต้อง

  • WWW-รับรองความถูกต้อง

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

ตัวอย่างข้อความตอบกลับ

ตอนนี้เรามารวบรวมทั้งหมดเข้าด้วยกันเพื่อสร้างการตอบสนอง HTTP สำหรับคำขอเพื่อดึงหน้า hello.htm จาก เว็บเซิร์ฟเวอร์ทำงานบนเว็บไซต์

HTTP/1.1 200 ตกลง วันที่: จันทร์ 27 ก.ค. 2552 12:28:53 GMT เซิร์ฟเวอร์: Apache/2.2.14 (Win32) แก้ไขล่าสุด: พุธ 22 ก.ค. 2552 19:15:56 GMT ความยาวเนื้อหา: 88 เนื้อหา - ประเภท: text/html การเชื่อมต่อ: ปิด สวัสดีชาวโลก!

ตัวอย่างต่อไปนี้แสดงข้อความตอบกลับ HTTP ที่แสดงเงื่อนไขข้อผิดพลาดเมื่อเว็บเซิร์ฟเวอร์ไม่พบหน้าที่ร้องขอ:

HTTP/1.1 404 ไม่พบ วันที่: อาทิตย์ 18 ต.ค. 2555 เวลา 10:36:20 น. GMT เซิร์ฟเวอร์: Apache/2.2.14 (Win32) ความยาวเนื้อหา: 230 การเชื่อมต่อ: ปิดประเภทเนื้อหา: ข้อความ / html; charset=iso-8859-1 404 ไม่พบ ไม่พบ

ไม่พบ URL ที่ร้องขอ /t.html บนเซิร์ฟเวอร์นี้

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

HTTP/1.1 400 คำขอไม่ถูกต้องวันที่: อาทิตย์ 18 ต.ค. 2555 เวลา 10:36:20 น. GMT เซิร์ฟเวอร์: Apache/2.2.14 (Win32) ความยาวเนื้อหา: 230 ประเภทเนื้อหา: text/html; charset=iso-8859-1 การเชื่อมต่อ: ปิด 400 คำขอไม่ถูกต้อง คำขอไม่ถูกต้อง

เบราว์เซอร์ของคุณส่งคำขอว่าเซิร์ฟเวอร์นี้ไม่สามารถเข้าใจได้

บรรทัดคำขอมีอักขระที่ไม่ถูกต้องตามสตริงโปรโตคอล