【问题标题】:Is it necessary to url encode the file name?是否有必要对文件名进行 url 编码?
【发布时间】:2011-09-06 04:43:34
【问题描述】:

在我的 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-decode)。但在 Firefox 中,他们会得到类似 %5C%2D%0A.docx 的信息。现在我要删除代码中的HttpUtility.UrlEncode。但在此之前,我想确认在这种情况下不存在安全问题。请给我一些想法好吗?

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

【问题讨论】:

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


    【解决方案1】:

    如果是 ASCII,则名称可以用引号引起来。

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

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

    【讨论】:

    • 我想知道这一点,因为标题不是正确的字符集。我只是希望有某种魔法,因为我发现的规范没有特别提到非 ASCII 字符。这些日子之一,我将停止假设。并希望有魔法:)。
    【解决方案2】:

    请将您的代码更改如下:

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

    注意:您的代码缺少 "\"" 以将文件名括在引号中

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 1970-01-01
        • 2015-01-14
        • 2016-12-10
        • 2011-12-16
        • 2011-01-10
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多