是否有必要对文件名进行url编码?

时间:2011-09-06 04:43:34

标签: c# asp.net-mvc asp.net-mvc-3 firefox urlencode

在我的asp.net mvc应用程序中,我有代码:

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

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

编辑 Corbin的回答是正确的。但是在删除文件名的url-encoding后,一些使用旧版本IE的用户将获得奇怪的杂乱文件名。最后我只对那些用户进行url-encode。

3 个答案:

答案 0 :(得分:3)

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

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

如果你只是将原始的非ASCII字节粘贴到标题中,对于很大一部分用户来说,它几乎肯定会像垃圾一样。

答案 1 :(得分:3)

请更改您的代码,如下所示:

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

注意:您的代码错过" \""用引号

包装文件名

答案 2 :(得分:2)

http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html

除非我误解它,否则名称应该只是引号,而不是url编码。