2009-11-16 8 views
10

ASP.NET MVCアプリケーションであるすべての「通常の」ビューを指定する簡単な方法は、Content-Typeに追加されたcharset=utf-8ですか? View()には、Content-TypeActionResultを指定できるようなオーバーライドがなく、友人からも何も公開されていないようです。その動機は明らかに、「正しい」エンコーディングタイプを推測するInternet Explorerを回避することです。これはUTF-7 XSS攻撃を回避するために行います。すべてのASP.NET MVC HTTPレスポンスに「charset」を追加

答えて

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; 
    } 
} 

用途:@クレイグ・stuntzの考えに基づき

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

もちろん、レスポンスエンコーディングを確実に行う必要があります。つまり、コンテンツのエンコーディングはResponseCharset属性で指定されたものと一致する必要があります。

Chromeでいくつかのmvcコードをテストしていたときに、acceptヘッダーのエンコーディングが指定されていないため、多くの助けになりました。

関連する問題