2010-08-31 295 views
10

我有一個PHP的Web應用程序。我不想讓用戶發佈HTML到我的網站。用strip_tags()防止XSS?

如果我簡單地在保存到我的數據庫之前對所有數據運行strip_tags(),那麼strip_tags()是否足以防止XSS?

我問,因爲如果XSS被阻止,我不清楚documentation of strip_tags。瀏覽器似乎有一些錯誤,允許<0/script>(是,零)作爲有效的HTML。

UPDATE

我意識到,我可以簡單地運行在所有輸出的數據htmlspecialchars;然而,我的想法是 - 因爲我不想首先允許HTML,所以在保存在我的數據庫之前,一勞永逸地清理我的數據更簡單(並且學術上更好),然後每次都必須擔心如果數據是安全的,我輸出數據。

回答

1

strip_tags()可以幫助,但它不是防彈。由於它不驗證正在剝離的HTML,所以一些聰明人會發現一個HTML構造(破損或其他)被剝離,但仍然會導致一些不愉快的事情發生。但就目前而言,它應該處理大部分拋出它的東西。只是不要認爲這將永遠是真的。

同樣,如果允許任何標籤通過「允許標籤」參數通過,那麼這將允許通過任何特定於javascript的屬性,例如針對這些特定標籤的onclick。

2

它應該,我從來沒有聽說過這個0技巧。但你總是可以做strip_tags,然後htmlspecialchars只是爲了安全。好的做法是在應用程序上自己測試,因爲您知道可以嘗試輸入和測試哪種類型的數據,並查看它是否會打破它。只需搜索XSS漏洞的方法並將其用於您的測試數據。我會至少每週檢查一次新的漏洞,並不斷測試你的腳本以發現新的漏洞。

+0

+1無論如何,使用'htmlspecialchars()'來確保至少沒有任何東西被意外*解析,就好像它是HTML一樣。 – BoltClock 2010-08-31 02:32:55

5

正如其他人所提到的,您可以使用strip_tagshtmlspecialchars的組合來保護自己免受XSS攻擊。

strip_tags的一個壞處是,它可能會刪除用戶不會期望的無害內容。我看到技術人員寫這樣的東西,如:<edit> foo </edit>,他們完全期望這些標籤被視爲是。另外,我見過「正常」的人甚至爲「笑」而做了<g>之類的事情。如果沒有出現,他們會再次認爲這是一個錯誤。

所以個人,我避免strip_tags優先爲我自己的解析器,讓我明確地啓用某些安全的HTML標籤,屬性和CSS,明確禁止不安全的標籤和屬性,以及其他特殊字符轉換爲無害的版本。因此,文本總是被視爲人們所期望的。

如果我沒有可用的解析器,我只需使用htmlspecialchars來安全地編碼文本。

+1

解析器可能不安全。 HTML添加了新的元素和屬性。瀏覽器支持非標準瀏覽器。瀏覽器中的錯誤恢復是非常瘋狂的,並且可能會解析你不會期望的東西。跟上很難。 OTOH如果在所有輸出上運行'htmlspecialchars()',則每個標籤類文本都將被安全地轉換,並且始終是安全的。 – Kornel 2010-12-09 23:49:36

+1

@porneL,我所指的解析器只允許已知的白名單中的已知標籤和屬性。任何其他非安全字符都會被編碼。因此不可能產生不安全的代碼。 – Matthew 2010-12-09 23:56:54

+0

如果我確定在網站中輸入的數據不應包含任何類似HTML的字符,該怎麼辦?例如,輸入您的地址的表單?那樣的話,strip_tags就夠了嗎? – abeger 2011-08-22 15:38:53

11

strip_tags本身並不足以消除完全有效的非HTML內容。例如:

<?php 
echo strip_tags("This could be a happy clown *<:) or a puckered face.\n"); 
.... 
echo strip_tags("Hey guys <--- look at this!\n"); 

將輸出:

This could be a happy clown * 

和:

Hey guys 

一切後的最初<被刪除。非常討厭最終用戶!不允許保留HTML字符將是一個不好的舉措。在與HTML內聯使用時,這些字符需要用htmlentities或類似的函數進行轉義。

你需要更高級的東西,strip_tags - HTML Purifier工程很好,並且允許用戶使用HTML保留字符。

17

我強烈反對它「學術上更好」。

  • 它打破了用戶輸入(想象的StackOverflow將如何無用的是這種討論,如果他們所有的標籤「清洗」的帖子)。

  • 插入HTML的文本只有標籤被剝離將無效。 HTML需要&才能被轉義。

  • 它在HTML中甚至不安全! strip_tags()是不足以保護值的屬性,例如,<input value="$foo">可能與$foo = " onfocus="evil()(無<>需要!)

所以正確的方法是被利用,根據您的語言要求,以逃避數據」重新生成。當你有純文本並且你正在生成HTML時,你應該用htmlspecialchars()等將文本轉換爲HTML。在生成電子郵件時,應將文本轉換爲引用打印格式等。

+1

您一般是正確的,但用戶輸入不是無法觸及的聖潔腳本,類似於StackOverflow的服務是例外而非規則。如果您的應用程序期望參數ID爲正整數,那麼您應該放棄任何不是正整數的東西。 – kravietz 2015-03-23 12:53:59

+0

@kravietz我認爲整數ID在這裏不是一個精確的比喻,因爲它們不使用帶內信令。標記的指針會更接近,然後您肯定會相應地添加和刪除標記。 – Kornel 2015-03-23 20:22:15