Sử dụng bố trí nội dung trong tiêu đề phản hồi HTTP


127

Tôi đã tìm thấy mã asp.net sau đây rất hữu ích khi phục vụ các tệp từ cơ sở dữ liệu:

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

Điều này cho phép người dùng lưu tệp vào máy tính của họ và sau đó quyết định cách sử dụng tệp, thay vì trình duyệt đang cố sử dụng tệp.

Những điều khác có thể được thực hiện với tiêu đề phản hồi bố trí nội dung?


23
Lưu ý rằng mã mẫu của bạn sẽ bị hỏng nếu tên tệp chứa các khoảng trắng hoặc ký tự không phải ASCII. Xem RFC 6266 để biết thêm thông tin.
Julian Reschke

@JulianReschke, còn các ký tự ASCII được coi là không in được thì sao? ( 0đến 0x1F)
Pacerier

Đọc RFC 6266 (ngoài thực tế họ sẽ là một ý tưởng tồi để sử dụng trong tên tệp; người nhận có thể sẽ vứt chúng đi dù sao)
Julian Reschke

1
Bạn có thể sử dụng khoảng trắng, Unicode, v.v. nếu bạn sử dụng dấu ngoặc kép quanh tên. kb.mozillazine.org/ từ
Tony

1
@Ronnie Overby Bố trí nội dung là gì?
divy3993

Câu trả lời:


84

Lưu ý rằng RFC 6266 thay thế các RFC được tham chiếu bên dưới. Phần 7 phác thảo một số mối quan tâm bảo mật liên quan.

Cơ quan có thẩm quyền về tiêu đề xử lý nội dung là RFC 1806RFC 2183. Mọi người cũng đã nghĩ ra cách hack nội dung. Điều quan trọng cần lưu ý là tiêu đề xử lý nội dung không phải là một phần của tiêu chuẩn HTTP 1.1.

Tiêu chuẩn HTTP 1.1 ( RFC 2616 ) cũng đề cập đến các tác dụng phụ bảo mật có thể có của việc xử lý nội dung:

15,5 Vấn đề xử lý nội dung

RFC 1806 [35], từ đó
tiêu đề Nội dung xử lý nội dung (xem phần 19.5.1) thường được thực hiện trong HTTP, có một số
cân nhắc bảo mật rất nghiêm trọng. Bố trí nội dung không phải là một phần của
tiêu chuẩn HTTP, nhưng vì nó được triển khai rộng rãi, chúng tôi đang
ghi lại việc sử dụng và rủi ro cho người triển khai. Xem RFC 2183 [49]
(cập nhật RFC 1806) để biết chi tiết.


31
Ngày nay, cơ quan có thẩm quyền là RFC 6266.
Julian Reschke

@JulianReschke, "thay thế" và "cập nhật" hoạt động như thế nào? Các phiên bản mới hơn như RFC 7230 cũng khiến RFC 6266 trở nên lỗi thời?
Pacerier

@Pacerier - tại sao RFC 7230 sẽ ảnh hưởng đến RFC 6266?
Julian Reschke

@Julian, 1) Kể từ 6266 cập nhật 2616, 2) 2616 đã bị lỗi thời bởi 723X, 3) Sau đó, 6266 có bị coi là lỗi thời không?
Pacerier

5
Chà, RFC 5678 đây, RFC 9876 đấy. Nếu Xử lý nội dung được tán thành, chúng ta nên sử dụng cái gì thay thế?
Csaba Toth

25

Chà, có vẻ như tiêu đề Xử lý nội dung ban đầu được tạo cho e-mail chứ không phải web. ( Liên kết đến RFC có liên quan .)

Tôi đoán rằng các trình duyệt web có thể đáp ứng

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

khi tiết kiệm, nhưng tôi không chắc.



5

Đối với người dùng asp.net, .NET framework cung cấp một lớp để tạo tiêu đề bố trí nội dung: System.Net.Mime.ContentDisposeition

Cách sử dụng cơ bản:

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
Coi chừng, lớp này không phù hợp với RFC 6266 . Nó thực hiện mã hóa UTF-8 base64 trong filenametham số, thay vì sử dụng filename*tham số với mã hóa RFC 5987 . Không có cách nào để lấy được hoặc sử dụng các tiện ích fx để khắc phục điều đó, hầu hết mọi thứ đều không thể ghi đè hoặc nội bộ ... .Net fx vẫn còn một chặng đường dài để học mở và mở rộng. Trong MVC 5.2, FileResultlớp làm tốt hơn một chút filename, nhưng không xử lý các tham số khác inlinevà phần lớn việc thực hiện cũng là nội bộ ...
Frédéric

2

Tiêu đề này được xác định trong RFC 2183 , vì vậy đó sẽ là nơi tốt nhất để bắt đầu đọc.

Các giá trị được phép là những giá trị được đăng ký với Cơ quan cấp số được gán Internet (IANA); đăng ký giá trị của họ nên được coi là nguồn chính xác.


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.