การใช้การจัดการเนื้อหาในส่วนหัวการตอบกลับ HTTP


127

ฉันพบว่ารหัส asp.net ต่อไปนี้มีประโยชน์มากเมื่อให้บริการไฟล์จากฐานข้อมูล:

Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);

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

มีสิ่งใดอีกบ้างที่สามารถทำได้ด้วยส่วนหัวการตอบสนองการจัดการเนื้อหา


23
โปรดทราบว่าโค้ดตัวอย่างของคุณจะแตกหากชื่อไฟล์มีช่องว่างหรืออักขระที่ไม่ใช่ ASCII ดู RFC 6266 สำหรับข้อมูลเพิ่มเติม
Julian Reschke

@JulianReschke แล้วอักขระ ASCII ที่ถือว่าพิมพ์ไม่ได้ล่ะ? ( 0ถึง0x1F)
Pacerier

อ่าน RFC 6266 (นอกเหนือจากข้อเท็จจริงที่ว่าพวกเขาจะเป็นความคิดที่ไม่ดีที่จะใช้ในชื่อไฟล์ผู้รับมีแนวโน้มที่จะทิ้งมันไปอยู่ดี)
Julian Reschke

1
คุณสามารถใช้พื้นที่สีขาว Unicode เป็นต้นหากคุณใช้เครื่องหมายคำพูดคู่รอบชื่อ kb.mozillazine.org/…
Tony BenBrahim

1
@Ronnie Overby การจัดการเนื้อหาคืออะไร?
divy3993

คำตอบ:


84

โปรดทราบว่าRFC 6266แทนที่ RFC ที่อ้างถึงด้านล่าง ส่วนที่ 7ระบุถึงข้อกังวลด้านความปลอดภัยที่เกี่ยวข้องบางประการ

ผู้มีอำนาจในส่วนหัวการจัดการเนื้อหาคือRFC 1806และRFC 2183ผู้คนยังได้วางแผนการแฮ็กการจัดการเนื้อหา โปรดทราบว่าส่วนหัวการจัดการเนื้อหาไม่ได้เป็นส่วนหนึ่งของมาตรฐาน HTTP 1.1

มาตรฐาน HTTP 1.1 ( RFC 2616 ) ยังกล่าวถึงผลข้างเคียงด้านความปลอดภัยที่เป็นไปได้ของการจัดการเนื้อหา:

15.5 ปัญหาการจัดการเนื้อหา

RFC 1806 [35] ซึ่งมักจะนำ
ส่วนหัวContent-Disposition (ดูหัวข้อ 19.5.1) มาใช้ใน HTTP นั้นมี
ข้อพิจารณาด้านความปลอดภัยที่ร้ายแรงหลายประการ การจัดการเนื้อหาไม่ได้เป็นส่วนหนึ่งของ
มาตรฐาน HTTP แต่เนื่องจากมีการนำไปใช้อย่างแพร่หลายเราจึง
จัดทำเอกสารการใช้งานและความเสี่ยงสำหรับผู้ปฏิบัติงาน ดู RFC 2183 [49]
(ซึ่งอัปเดต RFC 1806) สำหรับรายละเอียด


31
ปัจจุบันผู้มีอำนาจคือ RFC 6266
Julian Reschke

@JulianReschke "แทนที่" และ "อัปเดต" ทำงานอย่างไร เวอร์ชันที่ใหม่กว่าเช่น RFC 7230 ทำให้ RFC 6266 ล้าสมัยหรือไม่
Pacerier

@Pacerier - ทำไม RFC 7230 ถึงส่งผลต่อ RFC 6266
Julian Reschke

@Julian, 1)ตั้งแต่ 6266 อัปเดต 2616, 2) 2616 ถูกทำให้ล้าสมัยโดย 723X, 3)แล้ว 6266 ถือว่าล้าสมัยด้วยหรือไม่?
Pacerier

5
ทีนี้ RFC 5678 ที่นี่ RFC 9876 ที่นั่น หากการจัดการเนื้อหาถูกขมวดคิ้วเราควรใช้อะไรแทน
Csaba Toth

25

ดูเหมือนว่าเดิมทีส่วนหัวการจัดการเนื้อหาถูกสร้างขึ้นสำหรับอีเมลไม่ใช่เว็บ ( ลิงก์ไปยัง RFC ที่เกี่ยวข้อง )

ฉันคาดเดาว่าเว็บเบราว์เซอร์อาจตอบสนอง

Response.AppendHeader("content-disposition", "inline; filename=" + fileName);

เมื่อประหยัด แต่ฉันไม่แน่ใจ



5

สำหรับผู้ใช้ asp.net เฟรมเวิร์ก. NET จัดเตรียมคลาสเพื่อสร้างส่วนหัวการจัดการเนื้อหา: System.Net.Mime.ContentDisposition

การใช้งานพื้นฐาน:

var cd = new System.Net.Mime.ContentDisposition();
cd.FileName = "myFile.txt";
cd.ModificationDate = DateTime.UtcNow;
cd.Size = 100;
Response.AppendHeader("content-disposition", cd.ToString());

1
ระวังชั้นนี้ไม่เป็นไปตามRFC 6266 ทำการเข้ารหัส UTF-8 base64 ในfilenameพารามิเตอร์แทนที่จะใช้filename*พารามิเตอร์ด้วยการเข้ารหัสRFC 5987 ไม่มีทางที่จะได้รับหรือใช้ยูทิลิตี้ fx เพื่อแก้ไขสิ่งนั้นเกือบทุกอย่างไม่สามารถเขียนทับได้หรือเป็นแบบภายใน ... Net fx ยังคงมีการเปิดกว้างและความสามารถในการเรียนรู้ที่ยาวนาน ใน MVC 5.2 FileResultคลาสทำได้ดีกว่าเล็กน้อยสำหรับfilenameแต่ไม่ได้จัดการกับพารามิเตอร์อื่น ๆinlineและการใช้งานส่วนใหญ่ก็เป็นแบบภายในเช่นกัน ...
Frédéric

2

ส่วนหัวนี้กำหนดไว้ในRFC 2183ดังนั้นจึงเป็นจุดเริ่มต้นที่ดีที่สุดในการเริ่มอ่าน

ค่าที่อนุญาตคือค่าที่ลงทะเบียนกับ Internet Assigned Numbers Authority (IANA); การลงทะเบียนค่าควรถูกมองว่าเป็นแหล่งที่มาที่ชัดเจน


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