iberck
9/13/2015 - 12:29 AM

Grails escape/encode

Grails escape/encode

Nomenclatura en Grails

La palabra "encode" es utilizada como sinónimo de "escape" dentro de Spring/Grails.

import springframework.web.util.HtmlUtils

class HTMLCodec {
    static encode(theTarget) {
        HtmlUtils.htmlEscape(theTarget?.toString())
    }
    
    static decode(theTarget) {
        HtmlUtils.htmlUnescape(theTarget?.toString())
    }
}

Referencia HtmlUtils.htmlEscape

Escapar/Codificar texto

Cuando se escapa un texto hacia un formato se está indicando: transforma el texto de tal forma que escape los símbolos incompatibles a símbolos compatibles en el formato indicado.

Por ejemplo si se escapa el texto <input type="text"></input> como html, escapará cada caracter html dentro texto. Por ejemplo transformará < a su entidad html correspondiente: &lt;. Una vez escapado todo el texto a html, éste no será interpretado por el browser y mostrará en la página el texto: <input type="text"></input>.

Por el contrario si no se escapa el texto <script>alert('hola')</script> dicho texto será interpretado por el browser y mostrará una alerta con el texto hola.

Grails y enconding

Desde Grails 2.3 todas las expresiones ${} son automáticamente escapadas como html en las GSPs. Esto es muy útil porque la entrada del usuario es escapada por lo que cualquier código Javascript/HTML no es interpretado por el browser o por javascript. Gracias a este esquema por default, las aplicaciones Grails están protegidas de ataques Cross Site Scripting (XSS).

Codecs implementados por grails

Codecs de grails por defecto

Encode as none/raw

Codificar como none o raw son sinónimos y quiere decir "deja el texto en el formato que se encuentra".

Distintas formas de escapar texto:

${raw(text)}

text.encodeAsRaw()

HtmlUtils.htmlUnescape(text)

Encode as json

text.encodeAsJSON(): Escapa el texto como json.

<script>
    var v = "${'{"llave":"valor"}'.encodeAsJSON()}"
    var obj = JSON.parse(v)
</script>

Si el texto no se escapara como json, Grails lo escaparía por automático como html y cambiaría los " por &quot; y ya no se podría parsear a json.

Encode as HTML

text.encodeAsHTML(): Escapa el texto como html.

Escapes de grails por default

En el archivo Config.groovy se define cómo escapar por default en cada parte de la app:

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

Encode en TagLibs

Escapa la salida del taglib como html:
static defaultEncodeAs = 'html'

No escapa la salida del taglib, por ejemplo si escribe: <input type="checkbox"></input> será interpretado como código html por el browser y mostrará un checkbox:

defaultEncodeAs = [taglib: 'none']

HtmlUtils

HtmlUtils.htmlUnescape(""): transforma los caracteres html a su texto correspondiente, por ejemplo: &lt; hacia <

HtmlUtils.htmlEscape(""): Escapa los caracteres a su código correspondiente en html, por ejemplo < hacia &lt;

Referencia

http://mrhaki.blogspot.mx/2013/11/grails-goodness-generating-raw-output.html

https://github.com/grails/grails-core/wiki/Default-Codecs