2010-04-09 71 views
4

如何防止html實體的雙重編碼或者以編程方式修復它們?如何防止在實體中允許雙重編碼html實體

我使用perl模塊的HTML::Entities中的encode()函數對用戶輸入中的HTML實體進行編碼。這裏的問題是我們也允許用戶直接輸入HTML實體,並且這些實體最終被雙重編碼。

例如,用戶可以輸入:

Stackoverflow & Perl = Awesome…

這最終被編碼以

Stackoverflow & Perl = Awesome…

這使得在瀏覽器中

Stackoverflow & Perl = Awesome…

我們希望這呈現爲

Stackoverflow & Perl = Awesome...

是否有辦法防止這種雙重編碼?還是有一個模塊或代碼片段,可以輕鬆解決這些雙重編碼問題?

任何幫助,不勝感激!

+1

必須...不是...巨魔是靜態類型系統... – 2010-04-09 01:39:39

+1

@jleedev =>這是什麼都與靜態類型系統呢? – 2010-04-09 01:50:16

+0

嗯,我還沒有完全讀完整個問題。保持你的髒輸入與輸入輸出分開。 – 2010-04-09 01:51:54

回答

6

您可以首先解碼字符串:

my $input = from_user(); 

my $encoded = encode_entities(decode_entities $input); 
1

考慮將呼叫保存到encode(),直到您檢索顯示值,而不是在您存儲之前。只要您的檢索機制一致,數據庫中的額外數據可能就不值得煩惱了。

編輯

重讀你的問題,我現在意識到我的回答並不能完全解決問題看到,因爲調用encode()後仍會有同樣的結果。不知道替代我自己,它可能沒有太大的幫助,但你可能想要考慮找到一種更適合的方法進行編碼,將尊重現有的符號。

+0

我認爲尊重現有實體的方法是理想的。我知道用PHP編碼的相應方法有一個標誌來防止重複編碼。 Perl中是否存在這樣的方法? – Bob 2010-04-13 01:45:56

4

有一個非常簡單的方法來避免這種情況:

  1. 在輸入時再次輸出階段刪除所有的實體(把它們轉換成Unicode)轉換成實體
  2. 編碼。
+0

永遠。始終以已知格式存儲數據。不要混合搭配。始終對輸入進行解碼(轉換爲已知格式)。始終對輸出進行編碼(轉換爲顯示或交互所需的格式)。適用於HTML實體,就像應用於Unicode一樣。 – hobbs 2010-04-09 04:39:05