Нужно ли URL кодировать имя файла? - PullRequest
2 голосов
/ 06 сентября 2011

В моем приложении 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 в коде.Но прежде чем сделать это, я хочу подтвердить, что в этом случае нет проблем с безопасностью.Не могли бы вы дать мне несколько идей?

РЕДАКТИРОВАТЬ Корбин ответ правильный.Но после удаления url-кодировки имени файла некоторые пользователи, использующие старую версию IE, получат странные грязные имена файлов.Наконец, я делаю url-кодирование только для этих пользователей.

Ответы [ 3 ]

3 голосов
/ 07 сентября 2011

Имя может быть в кавычках, если это ASCII.

Если это не ASCII, тогда вы должны использовать кодировку, определенную в RFC 2231 или кодировку в RFC 5987 или кодировку в RFC 2047... какие браузеры поддерживают какую из них, конечно, забавную игру.: (

Если вы просто вставите необработанные байты, отличные от ASCII, в заголовок, это почти наверняка будет выглядеть мусором для большой части пользователей.

3 голосов
/ 14 мая 2014

измените свой код следующим образом:

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

примечания: ваш код пропущен "\" "для переноса имени файла в кавычки

2 голосов
/ 06 сентября 2011

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

Если я не понимаю это, похоже, что имя должно быть в кавычках, а не в кодировке URL.

...