2012-05-08 4 views
1

私たちはURLでLANGパラメータを渡すと、私は返すRequestContextUtils.getLocale(リクエスト)、によって、ロケールを取得することができ、コードでのGrailsアプリケーションGrailsは

/url?lang=de 

のロケールを変更することを知っていますlangパラメータを使用して、ParamsAwareLocaleChangeInterceptor(grailsソースの一部)で設定されたロケール。

スクリプトまたは破損した文字列がlangパラメータに値として渡された場合、同じクラップがロケールとして設定されます。

/url?lang=>"'><script>alert(167) </script>&=>"'><script>alert(167)</script> 

この要求では、httpヘッダーのContent-languageは、langパラメータのscript = valueに設定されます。このRCU.getLocale()の後には、多くのコンテンツがロケールに基づいて決定されるため、私のサイトのコンテンツを乱すこの悪意のあるスクリプトが返されます。この問題を回避する方法(ロケールを設定する前にlangをサニタイズする)か、これはgrailsのバグですか?

また、langで渡されている内容を制限できますか?例:サイトで 'en'と 'de'だけがサポートされている場合、/ url?lang = esを渡すとコンテンツが壊れます。 grailsインターセプタでロケールの変更が起こる前に、langパラメータの値を 'en'と 'de'だけに制限する方法がありますか?

+0

これはおそらくバグです。 [いくつかのコードはここ](http://stackoverflow.com/questions/2819768/grails-language-prefix-in-url-mappings) を使用して回避することができます。 –

+0

'/ url?lang'を渡すのではなく、コントローラからロケールを設定したいかもしれません。アクション内でnate_weldonの 'setLocale'コードを使用し、言語セレクタでそのアクションにリンクするだけです。 – GalmWing

+0

なぜゴミ箱はゴミをチェックするのですか? langがロケールを変更するために使用できる機能はまったく役に立たない。 – scout

答えて

0

3つのオプションが考えられます。

1)langを制限するには、リクエストごとにロケールをフィルタに設定します。しかし、これはリロード時に毎回リセットされています。

def filters = { 

    before = { 
     def locale = new Locale("sv","SV") 
     RCU.getLocaleResolver(request).setLocale(request, response, locale)     
    } 

} 

2)messages.propertiesファイルのみを残して、すべてのメッセージプロパティファイルを削除することができます。したがって、システムは常にこのプロパティファイルをデフォルトにします。

3)デフォルトのロケールを設定するには、config/spring/resources.groovyでLocaleResolverを設定できます。

+0

デフォルトのロケールを設定したくない。cozはすでにデフォルトである。私はそれを2つのロケールに制限したい、 – scout

+0

フィルタは両方の方法で動作することができます。これは、デフォルトを常に設定する単純なものでした。フィルタを使用してゴミをキャッチし、適切なフィルタを使用して –

+0

フィルタを使用して、クラップとsetLocaleを適切な値に削除できます。しかし、コントローラRCU.getLocaleの内部では、同じくたびれを返します。私はこれがHTTP要求ヘッダーのContent-languageが壊れていると考えています – scout