c# - 是否需要对文件名进行url编码?

标签 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));

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

编辑 Corbin 的回答是正确的。但是去掉文件名的url编码后,一些使用旧版IE的用户会得到奇怪的乱七八糟的文件名。最后我只为那些用户做 url-encode。

最佳答案

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

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

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

关于c# - 是否需要对文件名进行url编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7315034/

相关文章:

c# - 具有绝对返回路径的方法如何内联?

c# - 状态栏大红叉出现

c# - 如何实现离线读写锁

asp.net-mvc-3 - MVC 3 自定义/Http 错误页面未显示 View 异常

asp.net-mvc-3 - 51Degrees 在每个请求上重新加载会减慢 ASP.NET MVC 的爬行速度

c# - 在 Controller 中调用方法

c# - Protobuf-net:无法创建抽象类的实例

asp.net - 我无法从添加引用对话框中找到 System.Web.MVC [我位于 Webform 应用程序中]

.net - 如何使查询字符串防篡改?

asp.net-mvc - MVC4 Ajax 表单 URL