2011-09-20 76 views
1

我使用AntiSamy來消毒用戶輸入,它運行良好。有一個問題:它編碼單引號和雙引號。所以如果我想編輯一些東西,my sample's會被渲染而不是my sample's - 單引號會被編碼。如何解密java中的單引號和雙引號?

澄清:broswer正確地呈現引號,但它們被保存在我的數據庫中作爲HTML實體。所以當用戶加載一篇文章進行編輯時,HTML實體將顯示在文本字段中。

  1. 有沒有辦法避開這個限制?
  2. 我應該使用/有沒有任何不同的工具?

我的用戶可以發佈代碼和各種其他的東西。所以AntiSamy在那裏做的很好。但我不想在普通文本中轉換單引號和雙引號。

我有什麼選擇?

回答

2
String s = "string unencode ' "NOW""; 
String unencoded = s.replaceAll("'", "'").replaceAll(""","\""); 
myTextField.setText(unencoded); 
1

如果AntiSamy沒有反轉方法,特別是可以通過commons-lang的StringEscapeUtils.unesacpeHtml(..)來處理。

瀏覽器知道如何顯示',所以應該沒有問題。僅當您要在textarea或其他輸入控件中或在瀏覽器外部顯示文本時才使用上述內容。

+0

對不起,我沒有很好地解釋自己。我在談論用戶加載帖子進行編輯時,文本字段會顯示包含HTML實體的原始文本。所以AntiSamy在我的東西到達數據庫之前編碼。這可以。我只是不希望它在普通文本中編碼單引號和雙引號,例如StackOverFlow。他們對所有內容進行編碼,但他們僅引用普通文本。我希望這是有道理的。 – dee

+0

另外,StringUnescapeUtils不能被使用,因爲它可能編碼危險的輸入。我想我只想對我編碼的內容進行選擇,而不是編碼。 – dee

+0

那麼我的第一段應該適合你 – Bozho

1

如果您需要的所有內容都是在輸入中轉義潛在危險字符,則可以將該輸入以原始形式存儲在數據庫中,並將其編碼爲輸出。

如果編碼過程更復雜(即應用了一些標記白名單或格式化規則),則可以存儲兩個版本的輸入 - 一個用於顯示的編碼HTML版本和一個用於編輯的原始版本,並在更新HTML版本時更新原始版本被修改。

+0

謝謝。這有點棘手,因爲有些用戶可以編輯其他人的帖子。這意味着原始文本必須經過消毒處理。但是,它必須對不合格的內容進行消毒,同時保留複雜的格式化規則和示例代碼。它應該不會在正常文本中編碼引號。 – dee

+0

一個很好的例子是StackOverFlow如何做到這一點。他們淨化一切。但是當你去編輯你的文章時,一切都很好。單引號和雙引號不編碼。 – dee

+0

@dee:我相信StackOverflow使用上述第二種方法。 – axtavt