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

本文关键字:url 编码 文件名 | 更新日期: 2023-09-27 18:07:55

在我的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会自动对文件名进行url解码)。但是在Firefox中,他们会得到类似%5C%2D%0A.docx的东西。现在我要删除代码中的HttpUtility.UrlEncode。但在此之前,我想确认这个案例没有安全问题。你能给我一些建议吗?

EDIT Corbin的答案是正确的。但是在删除文件名的url编码后,一些使用旧版本IE的用户会得到奇怪的混乱的文件名。最后,我只对这些用户进行url编码。

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

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

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

如果您只是将原始的非ascii字节粘贴到头中,那么对于大部分用户来说,它几乎肯定会看起来像垃圾。

请按如下方式修改代码:

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

注释:你的代码缺少"'"来在引号中包装文件名

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

除非我理解错了,看起来名字应该只是引号,而不是url编码。