2011-09-06 68 views
2

在我的asp.net MVC应用我的代码:是否需要对文件名进行网址编码?

response.ContentType = "application/octet-stream"; 
response.AddHeader("Content-Disposition", "attachment;filename=" + 
    HttpUtility.UrlEncode(attachment.FileName)); 

让所有的中国字符的URL编码为类似%5C%2D。在IE/Chrome中,当用户下载文件时,他们会得到中文文件名(即IE/Chrome会自动对文件名进行网址解码)。但在Firefox中,他们会得到类似%5C%2D%0A.docx的东西。现在我要删除代码中的HttpUtility.UrlEncode。但在这之前,我想确认在这种情况下没有安全问题。你能给我一些想法吗?

编辑 Corbin的回答是正确的。但是,在删除了文件名的url编码之后,一些使用旧版本IE的用户将得到奇怪的杂乱文件名。最后我只为这些用户进行网址编码。

回答

3

如果名称是ASCII,则允许使用引号。

如果它不是ASCII码,那么您必须使用RFC 2231中定义的编码或RFC 5987中的编码或RFC 2047中的编码......当然,浏览器支持哪些是有趣的游戏。 :(

如果您只是坚持原非ASCII字节到页眉,它几乎肯定会像垃圾,为用户的大部分

+0

我在想这件事,因为头文件不会是正确的字符集,我只是希望有一些神奇的,因为规范我发现没有具体提到非ASCII字符。其中一天,我会停止假设。并希望在魔术:)。 – Corbin

3

请改变你的代码如下:

if (Request.Browser.Browser == "IE" || Request.Browser.Browser == "Chrome") 
{ 
    filename = HttpUtility.UrlPathEncode(filename); 
} 
Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); 

笔记:你的代码错过了“\”“换行文件名