2013-04-25 26 views
0

我正在使用PlayFramework2我找不到正確處理HTML轉義的方法。使用PlayFramework2在JSON中轉義HTML

在模板系統中,默認過濾HTML實體。
但是,當我使用Backbone.js REST請求時,我的JSON對象不被過濾。

我用play.libs.Json.toJson(myModel)改造的對象字符串
因此,在我的控制器中,我使用return ok(Json.toJson(myModel));來發送響應......但在這裏,我的模型的屬性並不安全。
我不能找到一種方法來處理它...

第二個問題:
模板默認引擎過濾器的HTML實體,這意味着我們必須存儲到我們的數據庫的原始用戶輸入。
它是一種保存行爲嗎?

三questdion:
在PlayFramework是否有manualy逃逸字符串的函數?我能找到的所有人都需要添加新的依賴關係。

謝謝!

編輯:我找到了一種在Backbone.js的模板級別: - 使用myBackboneModel.escape('attr');代替myBackboneModel.get('attr');
Underscore.js模板系統還包括選擇:<%= attr %>呈現不逃跑,但<%- attr %>呈現逃跑!
只要注意效率,字符串在每次渲染時都會被重新轉義。這就是爲什麼Backbone.create()應該是首選。

回答

2

XSS攻擊預防的最佳實踐通常建議您推理關於您的輸出而不是您的輸入。這背後有很多原因。在我看來,最重要的是:

  • 除非你確切地知道你將如何輸出/呈現你的數據,否則它沒有任何理由逃避的東西。因爲不同的呈現方式將需要不同的轉義策略,例如正確轉義的HTML字符串不足以在JavaScript塊中使用它。需求和技術不斷變化,今天你以一種方式渲染你的數據 - 明天你可能會用另一種方式(假設你將在一個不需要HTML轉義的移動客戶端上工作,因爲它根本不使用HTML,渲染數據)在渲染數據時,您只能確定正確的轉義策略。這就是爲什麼現代框架委託逃避模板引擎。我建議閱讀以下文章:XSS (Cross Site Scripting) Prevention Cheat Sheet
  • 轉義用戶的輸入實際上是一種破壞性/有損操作 - 如果在將用戶的輸入保存到存儲之前轉義用戶的輸入,則永遠不會查明其原始輸入是什麼。沒有確定性的方式來'逃避'HTML轉義字符串,請考慮我上面的移動客戶端示例。

這就是爲什麼我相信正確的做法是將轉義委託給您的模板引擎(即Play和JS模板引擎用於Backbone)。沒有必要將序列化爲JSON的HTML轉義字符串。請注意,在幕後,JSON序列化程序將JSON轉義您的字符串,例如如果你的字符串中有一個引號,它將被正確地轉義以確保結果JSON是正確的,因爲它是一個JSON序列化器,因此它只關心正確的JSON呈現,它對HTML(它不應該)一無所知。但是,當您在客戶端呈現JSON數據時,應該使用由用於Backbone的JS模板引擎提供的功能正確地HTML轉義它。

在回答另一個問題:您可以使用play.api.templates.HtmlFormat逃脫原手動HTML字符串:

import play.api.templates.HtmlFormat 
... 
HtmlFormat.escape("<b>hello</b>").toString() 
// -> &lt;b&gt;hello&lt;/b&gt; 

如果你真的需要進行JSON編碼器逃避某些HTML字符串,一個好主意,可能是創建一個包裝對於他們來說,假設我們說RawString並提供自定義Format[RawString]這也將HTML轉義爲其writes方法中的字符串。詳情請參閱:play.api.libs.json API documentation