根据马克·帕尔默的说法
简而言之,保护您的应用免受代码注入XSS攻击 你必须:
将config中的默认grails.views.default.codec设置为“HTML”
行。 所以,如果我在Config.groovy中有以下内容
grails.views.default.codec = "none"
在我的控制器中,我添加:
def afterInterceptor = { model ->
model.headerJs = "alert('bingo for '+[$params.unitId]);"
}
在我的GSP中:
<r:script disposition="head">${headerJs}</r:script>
有效。当我查看源代码时,我看到了预期的javascript警报,并在页面服务时收到警报。
但是,如果在Config.groovy中我应用了建议的更改:
grails.views.default.codec = "html"
我的GSP渲染
<script type="text/javascript">alert('halooba for '+[1]);</script>
我能看到的是非常安全的。
我使用此应用程序的目标是在域中为客户存储自定义JS代码段,各种属性和其他值。这些值将由我们的管理员(而非客户)输入。根据谁通过HTTP请求调用页面,例如www.mydomain.com/ThisApp/?customerId=13423(但是编码的customerId),我将从我的控制器调用服务以从中获取客户的相关设置域名并将其注入GSP。
我知道我可以将JS和CSS放入文件中,然后使用Resources Plugin将它们正确地引入,但我也在考虑使用这种方法进行特定的自定义。
所以,要遵循这种安全方法,我要么必须能够对此进行解码,要么我需要确定将javascript包含在不对其进行编码的GSP中的另一种方法。
有什么建议吗?
谢谢!
答案 0 :(得分:0)
您可以使用GSP中提供的raw()建议Grails不要逃避:
<r:script disposition="head">${raw(headerJs)}</r:script>
答案 1 :(得分:0)
对于Grails 2.2.x及更低版本,您可以在Config.groovy中添加推荐的编码:
grails.views.default.codec = "html"
并使用Taglib引入SAFE值,不应使用HTML编码:
<r:script><com_myapp:getJSDeferred unitId="${params.unitId}" /></r:script>
它将被渲染为原始。
答案 2 :(得分:0)
仅供参考:以上解决方案不允许将JSON输出分配给javascript变量。 我的解决方法是,你将model.data定义为hashmap:
var someVar= ${raw(data as JSON).toString())};