2013-02-28 104 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