Grails - 默认安全编码

时间:2012-07-14 19:46:02

标签: security grails groovy xss sql-injection

我将数据提交到Grails中的控制器并进行了javascript注入。我很惊讶,因为我认为默认是在参数进入控制器时对其进行编码。我可以轻松设置它,以便所有参数在到达控制器时进行编码吗?另外,我可以安全地使用文本GORM create,或者是否容易受到SQL注入攻击?我看到in the guide如何阻止find查询的SQL注入,但是对象创建呢?

我还看到有一个encodeAsHTML方法可以在返回客户端的路上调用。我不想在它进入数据库之前这样做,这样我只需编码一次吗?谢谢!

1 个答案:

答案 0 :(得分:9)

用户输入

对您的内容进行“清理输入”(或预先编码或预先转发)的想法非常糟糕。当你真正需要它时,它实际上并没有保护你,并导致各种设计难题。甚至PHP终于抛弃了这项技术。

通过正确的API正确处理数据总是更好,这样可以消除风险。例如,使用带有内容占位符的预准备语句或语句来消除SQL注入绝对。这种技术已经存在了很长时间(只要我使用Java和SQL)。

Grails(GORM)自动处理对通过对象保存的任何内容进行编码,包括设置单个属性,创建新对象并保存,或通过obj.properties = params或类似设置属性。

只要您使用GORM,就不存在SQL注入的风险。

内容存储

此外,将已经编码的信息存储在数据库中通常被认为是不正确的,因为该编码仅对于给定的显示类型(例如HTML)是正确的。如果您想使用JSON渲染它,则HTML编码不正确。 XML也略有不同,有时您也可能更喜欢纯文本。

相反,您通常应将原始(UTF8或类似)数据存储在数据库中,并在呈现显示时将其转换为正确的显示类型。请注意,它在呈现时被转换为 - 这并不一定意味着每次将其发送到客户端。您可以使用各种缓存技术来确保不会经常发生这种情况 - 包括new cache plugin added to Grails 2.1

防止XSS Attacks

然而,一种强烈推荐的技术是使用grails.views.default.codec option将默认视图编解码器设置为HTML,如下所示:

grails.views.default.codec = 'html'

这只会影响GSP,只会使用美元符号语法(${foo})回显内容。这使您可以灵活地使用标记(推荐方式)或<%= %>语法覆盖此行为,以实现一次性情况。但是,它应该提供一个合适的方法来防止XSS攻击。

性能注意事项

最后需要注意的是:将HTML内容编码为性能问题的问题将被视为过早优化。机会高,任何性能瓶颈都会出现在其他地方,而不是内容的编码。首先构建应用程序 - 使用良好的设计 - 然后在对基准测试运行的应用程序进行基准测试和分析后进行优化。