Grails - 在检索i18n消息时阻止XSS

时间:2015-12-09 12:12:24

标签: javascript grails xss

我正在使用messageSource访问服务层中的i18n属性,以便在发生错误时提供用户反馈;

messageSource.getMessage('validation.my.code',args,defaultLocale)。

结果被推送到flash范围(信息或错误)并作为json返回到浏览器并在jQuery中处理,如下所示;

$.ajax({
    type: 'POST',
    url: 'update',
    data: formData,
    success: function (data) {
        // do stuff
        showMessage({info: data.info, error: data.error});
    }
})

我的问题是,当传递给messageSource的arg显示用户输入时,例如“'johndoe'用户名已经被占用”,就有可能发生XSS攻击。 我在Config.groovy中的编码设置如下,因为它会破坏应用程序的其他部分,如果有更严格的话。

codecs {
  expression = 'html' // escapes values inside ${}
  scriptlet = 'none' // escapes output from scriptlets in GSPs
  taglib = 'none' // escapes output from taglibs
  staticparts = 'none' // escapes output from static template parts
}

我想知道是否有一种优雅的方式来处理逃避json被返回而无需手动滚动我自己的解决方案。

编辑:更多细节

只需将以下内容放入UI表单的相关输入字段即可攻击以上内容:

<script>alert('hello');</script>

通过以下方法在服务层中进行验证;

private List<String> validate(def domainObject) {
    def messages = []
    if (!domainObject.validate()) {
       messages = domainObject.errors.allErrors.collect {
       // the error objects implement MessageSourceResolvable  
       simpleMessageSource.getMessage(it, args, defaultLocale)   
    }
    messages
}

将输入传递给args方法,成为返回给用户的错误字符串的一部分,最终以json的形式输出回浏览器。 这当然是一个JavaScript弹出窗口,上面写着“你好”。

1 个答案:

答案 0 :(得分:0)

关于文档:https://grails.github.io/grails-doc/2.4.5/guide/security.html grails默认通过解码输入值来拒绝XSS攻击