2013-04-10 101 views
0

我使用PHP中的PDO驅動程序將html從<textarea></textarea>保存到Mysql數據庫。我曾嘗試使用htmlentities() & htmlspecialchars()。當從數據庫中請求html顯示在DOM中時(分別使用html_entity_decode & htmlspecialchars_decode),它會直接返回標籤。HTML字符被字面翻譯

因此,舉例來說:

強大的文本將恢復爲<strong>strong text</strong>

我不能完全肯定是否顯著,但這些頁面在ANSI編碼和我的文檔類型是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+0

輸入是HTML,輸出是HTML。爲什麼你需要逃避? – 2013-04-10 10:29:23

回答

1

我從一個<textarea></textarea>保存html

請注意,就瀏覽器而言,它是發送文本。它是HTML還是不取決於你如何處理它。

我一直在使用htmlentities() & htmlspecialchars()

htmlspecialchars()是正確的工具,如果你想,如果<strong>在文本區域輸入顯示HTML文檔(即在提交的文本使用嘗試和你想要呈現文字小於,強,大於,並且不具有用於強元素的開始標籤)。如果您想將提交的文本視爲HTML,請不要使用這些功能。

當從數據庫請求的HTML DOM中的顯示(分別使用任一html_entity_decode & htmlspecialchars_decode)它是字面上返回代碼。

這是你的問題。

您的位置:

  1. 採取一些文字
  2. 編碼它渲染爲HTML
  3. 插入HTML到數據庫
  4. 獲取HTML出數據庫
  5. 解碼HTML的插入文本
  6. 將文本插入HTML文檔,將其視爲HTML

你應該做的:

  1. 採取一些文字
  2. 將其插入數據庫
  3. 把它拿出來的數據庫
  4. 編碼爲HTML
  5. 插入HTML到HTML文檔

使用htmlspecialchars在第4步,永遠不要解碼它(瀏覽器會這樣做)。

如果您希望用戶能夠輸入將呈現爲HTML的HTML,則請跳過步驟4.這會使您容易受到XSS攻擊,因此除非您完全信任訪問的每個人,否則請使用基於DOM的,在數據上將HTML清理程序列入白名單。

+0

謝謝,正式注意。我切換到html5,我寫了一個clean_tag()函數,無論如何它都包含了白名單清理工具。 – 2013-04-10 12:30:11