2013-04-13 25 views
3

在變量(由人工輸入填充)上使用FILTER_SANITIZE_STRING時,我有一個奇怪的問題。它似乎剝離了<字符以及之後的任何文字。 >字符保持不變。FILTER_SANITIZE_STRING正在剝離<字符及其之後的任何文字

我認爲它認爲<是一個需要剝離的HTML標籤,但是它後面沒有關閉標籤,所以我沒有理解它爲什麼會這樣。有沒有辦法讓它離開<,並且仍然應該如何消毒?

+1

這就是它,http://php.net/manual/en/filter。 filters.sanitize.php爲了避免這個結果,請不要使用它。 – mario

+0

你想要做什麼? – deceze

+0

我希望它通過刪除html/php標籤等來清理字符串。這些工作正常,直到有人向我報告<字符及其後面的所有內容都被刪除,即使它是這樣的:「Blabla <這是其他文本「,這將導致」布拉布拉「。 – Sempiterna

回答

3

根本問題是,當您使用FILTER_SANITIZE_STRING去除HTML標籤時,您將輸入處理爲HTML。根據你的描述,你的輸入是純文本。因此,用戶已經報告過濾器只能破壞輸入數據。

雖然它似乎是一種非常流行的技術,但我從未理解在純文本上將HTML標籤作爲消毒方法的概念。如果它不是HTML,則不需要關心HTML標記,因爲您不需要關心SQL關鍵字或命令行命令。這只是數據而已。

但是,當然,當你注入你的字符串轉換成HTML事後你需要逃避它,以確保:

  1. 您的數據顯示爲,是
  2. 結果仍然是有效的HTML

這就是爲什麼htmlspecialchars()存在。同樣,當你動態地生成任何其他類型的代碼時,你需要使用相應的轉義機制:SQL,JavaScript,JSON ...

+0

你有一個點。我試圖保護我的應用程序免受攻擊,但我認爲它完全可以安全地跳過FILTER_SANITIZE_STRING(或strip_tags()),並且在將它添加到數據庫之前就簡單地使用htmlspecialchars()已經在做。這也將htmlencode php開放/關閉標籤。 – Sempiterna

+4

在存儲數據之前,我不會應用'htmlspecialchars()'。這使得它更難以用於其他任何顯示在網站上的內容。我會保存原始數據並在實際使用時進行轉換。按需轉義的過載幾乎不明顯。 –