在我的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。
答案 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编码。