2009-11-16 2 views
10

Есть ли простой способ указать все «обычные» представления, это приложение ASP.NET MVC должно содержать charset=utf-8, добавленное к Content-Type? View() не имеет переопределения, которое позволяет указать Content-Type и ActionResult, и друзья, похоже, ничего не раскрывают. Очевидно, что мотивация заключается в том, чтобы обойти Internet Explorer, угадывая «правильный» тип кодирования, который я, в свою очередь, хочу сделать, чтобы избежать атак типа XSS UTF-7.Добавление «charset» ко всем HTTP-ответам ASP.NET MVC

ответ

20

Возможно, это в вашем web.config будет делать магию?

<configuration> 
    <system.web> 
    <globalization requestEncoding="utf-8" responseEncoding="utf-8" /> 
    </system.web> 
</configuration> 
+2

+1; Мне нравится это лучше, чем мое предложение, хотя я считаю, что оба будут работать. –

+1

Для справки, по умолчанию как requestEncoding, так и responseEncoding является utf-8 в любом случае. См. [MSDN] (http://msdn.microsoft.com/en-us/library/hy4kkhe0.aspx) – Appetere

+0

Обновлена ​​ссылка на [MSDN] (http://msdn.microsoft.com/en-gb/library/hy4kkhe0 (v = VS.100) .aspx) – Liam

2

Вы могли бы написать атрибут для него:

public class CharsetAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.Headers["Content-Type"] += ";charset=utf-8"; 
    } 
} 

Вы можете сделать это немного умнее, но это общая идея. Добавьте его в класс базового контроллера, и все ваше приложение будет закрыто.

+0

Это было бы здорово, если бы я работал в интегрированном режиме конвейера, но я не верю, что мне разрешено гадать с заголовками именно так на IIS6 и раньше, не так ли? –

+0

Вы можете, конечно, добавить их; мы протестировали это, и оно работает. Однако я не пробовал модифицировать существующий заголовок. Дать ему шанс; это легко проверить. –

0

В MVC 5 это может сделать трюк:

public class ResponseCharset : ActionFilterAttribute 
{ 
    private string Charset; 

    public ResponseCharset(string charset = "utf-8") { 
     Charset = charset; 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext filterContext) 
    { 
     filterContext.Response.Content.Headers.ContentType.CharSet = Charset; 
    } 
} 

Использование:

public class OrderDetailsController : ApiController 
{ 
    [ResponseCharset("utf-8")] // can be windows-1251 etc. 
    public Object Get(string orderId) 
    { 
     // .... 
    } 
} 

на основе @ идеи Craig-Stuntz «s.

Конечно, вам необходимо обеспечить правильное кодирование ответа, то есть кодирование содержимого должно соответствовать таковому, указанному в атрибуте ResponseCharset.

Это очень помогло мне, когда я тестировал некоторый код mvc с помощью Chrome, потому что он не указывает кодировку в заголовке accept.

Смежные вопросы