HTTP响应标头中内容配置的使用


127

我发现从服务器提供文件时,以下asp.net代码非常有用:

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

这样,用户可以将文件保存到计算机上,然后决定如何使用它,而不用浏览器尝试使用该文件。

内容处置响应标头可以完成哪些其他操作?


23
请注意,如果文件名包含空格或非ASCII字符,则示例代码将中断。有关更多信息,请参见RFC 6266。
朱利安·雷施克

@JulianReschke,被认为是不可打印的ASCII字符呢?(00x1F
Pacerier

阅读RFC 6266(但事实上,在文件名中使用它们会是一个坏主意;无论如何收件人都可能会将它们扔掉)
朱利安·雷施克

1
如果名称周围使用双引号,则可以使用空格,Unicode等。kb.mozillazine.org/…–
托尼·本·

1
@Ronnie Overby什么是内容处置?
divy3993

Answers:


84

请注意,RFC 6266取代了下面引用的RFC。第7节概述了一些相关的安全问题。

内容配置标头上的权限是RFC 1806RFC2183。人们还设计了内容处理黑客。重要的是要注意content-disposition标头不是HTTP 1.1标准的一部分。

HTTP 1.1标准(RFC 2616)还提到了内容配置的可能的安全副作用:

15.5内容配置问题

RFC 1806 [35]
是HTTP中经常实现的Content-Disposition (请参阅第19.5.1节)标头,它具有许多非常
重要的安全考虑。Content-Disposition不是
HTTP标准的一部分,但是由于它已被广泛实施,因此我们正在
记录其使用情况以及对实施者的风险。有关详细信息,请参见RFC 2183 [49]
(更新了RFC 1806)。


31
如今,授权机构是RFC6266。–
朱利安·

@JulianReschke,“取代”和“更新”如何工作?像RFC 7230这样的较新版本是否也会使RFC 6266过时?
Pacerier,2014年

@Pacerier-RFC 7230为什么会影响RFC 6266?
朱利安·雷施克

@Julian,1)自从6266更新2616以来,2) 723X已使2616过时了, 3)那么,6266是否也被视为过时了吗?
Pacerier,2015年

5
好吧,这里的RFC 5678,那里的RFC 9876。如果对内容处置不满意,我们应该使用什么呢?
卡萨巴托特

25

好吧,似乎Content-Disposition标头最初是为电子邮件而不是网络创建的。(链接到相关的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。它在filename参数中执行UTF-8 base64编码,而不是在RFC 5987编码中使用filename*参数。无法派生或使用fx utils来解决此问题,几乎所有内容都是不可重写或内部的。.net fx在学习开放性和可扩展性方面还有很长的路要走。在MVC 5.2,类确实好一点,但不处理其他参数和大部分实施也是内部...FileResultfilenameinline
弗雷德里克


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.