Grails escape/encode
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
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: <
. 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
.
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).
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)
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 "
y ya no se podría parsear a json.
text.encodeAsHTML()
: Escapa el texto como html.
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
}
}
}
}
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.htmlUnescape("")
: transforma los caracteres html a su texto correspondiente, por ejemplo: <
hacia <
HtmlUtils.htmlEscape("")
: Escapa los caracteres a su código correspondiente en html, por ejemplo <
hacia <
http://mrhaki.blogspot.mx/2013/11/grails-goodness-generating-raw-output.html