2013-02-28 75 views
2

在我的Grails应用程序,我正在从params提取文本,并将它作为我的域名查询参数:如何防止Grails的应用XSS攻击

例子:

def color = Colors.findByName(params.colorname) 

我想象有人可以拨打params.colorname参数来针对我的mysql数据库运行错误的查询。

什么是一些好的做法,以防止这样的事情?

+1

我相信你正在考虑[SQL注入](http://en.wikipedia.org/wiki/Sql_injection)而不是[XSS](http://en.wikipedia.org/wiki/Cross-site_scripting) ? – hsan 2013-02-28 22:09:38

+0

Html清理插件可以帮助消除用户输入的消毒http://nimavat.me/blog/sanitize-user-input-with-html-cleaner-plugin – 2017-08-10 05:52:20

回答

5

在视图中呈现可能包含XSS攻击的字段时,需要将其编码为HTML。你应该让所有包含用户输入的字段都被编码。所有的标准Grails标签都是用HTML编码的。如果您在视图中使用${},那么您可能会遇到麻烦。您需要手动将其编码为${colorname.encodeAsHTML()},或者使用类似fieldValue的标签(如果它是一个bean属性)。

您还可以在Config.groovy中设置grails.views.default.codec = "html"的全局默认编解码器。

小心双重编码,并确保您在自定义标记中将其编码为HTML。

您还引用了SQL注入攻击,它与XSS攻击不同。如果您正在编写自己的SQL或HQL并直接将用户输入内插到SQL/HQL中,那么您只会面临SQL注入的风险。这意味着要做Colors.executeQuery("from Colors where name like ?", params.colorname)而不是Colors.executeQuery("from Colors where name like $params.colorname")

+2

“所有标准Grails标记都以HTML编码。”在新版本2.2.2和2.1.5之前,情况并非如此。 'g.message'没有编码。这已经[在新版本中解决](http://jira.grails.org/browse/GRAILS-7170)。 – Weezle 2013-04-29 17:21:23

+1

根据Grails 2.3,双重编码不是一个问题。我可以为任何查看此问题的人推荐源代码链接。 资料来源:http://grails.github.io/grails-doc/2.4.5/guide/security.html – crashh 2015-06-13 11:02:56