有必要对文件名进行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编码。
如果是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编码。