【问题标题】:grails corrupted lang parametergrails损坏的语言参数
【发布时间】:2012-05-08 13:47:52
【问题描述】:

我们知道在 URL 中传递 lang 参数会改变 grails 应用程序的语言环境

/url?lang=de

在代码中,我可以通过 RequestContextUtils.getLocale(request) 获取语言环境,它使用 lang 参数返回在 ParamsAwareLocaleChangeInterceptor(grails 源的一部分)中设置的语言环境。

如果将脚本或损坏的字符串作为值传递给 lang 参数,则会将相同的废话设置为语言环境。

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

通过此请求,http 标头中的 Content-language 设置为 script= lang 参数的值。在这个 RCU.getLocale() 返回这个恶意脚本之后,它会弄乱我网站的内容,因为很多内容是根据语言环境决定的。是解决这个问题的方法(在设置语言环境之前清理语言)还是这是一个 grails 错误?

另外,我可以限制在 lang 中传递的内容吗?例如:如果站点仅支持“en”和“de”,则传递的 /url?lang=es 会混淆内容。在 grails 拦截器中更改语言环境之前,有没有办法可以将 lang 参数的值限制为仅 'en' 和 'de',可能在过滤器或其他东西中?

【问题讨论】:

  • 这可能是一个错误。您也许可以使用some of the code here 来解决它。
  • 也许您想从控制器设置区域设置而不是传递/url?lang。在动作中使用来自 nate_weldon 的 setLocale 代码,然后在您的语言选择器中链接到该动作。
  • 为什么 grails 不提供垃圾检查?那么可以使用 lang 来更改语言环境的功能完全没用

标签: grails locale


【解决方案1】:

我能想到 3 种可能的选择。

1) 要限制语言,您可以根据每个请求在过滤器中设置语言环境。但是你每次重新加载时都会重置。

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 来设置默认的语言环境。

【讨论】:

  • 我不想设置默认语言环境,因为英语已经是默认设置了。我想将其限制为 2 个语言环境,en 和 de
  • 过滤器可以双向工作。这只是一个简单的总是设置默认值。您可以使用过滤器捕捉垃圾,然后设置正确的
  • 使用过滤器去除废话并将本地设置为正确的值。但是当在控制器内部时, RCU.getLocale 仍然返回相同的废话。我认为这是因为 http 请求标头中的内容语言已损坏
  • setLocale 不起作用.. 所以我最终将页面重定向到在 lang 参数中使用正确语言环境的相同 url
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多