2010-03-20 70 views
18

Tumblr和其他博客網站允許用戶發佈來自YouTube和所有視頻網絡的嵌入式視頻代碼。當您允許用戶發佈RAW嵌入代碼時,如何保護自己免受XSS的侵害?

但他們如何過濾僅Flash對象代碼並刪除任何其他的HTML或腳本?甚至他們有一個自動化的代碼,信息你這不是一個有效的視頻代碼。

這是用REGEX表達式完成的嗎?有沒有一個PHP類來做到這一點?

謝謝

回答

24

一般來說,使用正則表達式是不是一個很好的方式來處理HTML:HTML不是正則表達式足夠正規:有在標準中允許太多的變化......而瀏覽器甚至接受HTML這無效 !


在PHP中,你的問題被標記爲php,存在過濾用戶輸入一個很好的解決方案是HTMLPurifier工具。

幾個有趣的事情是:

  • 它允許你指定其特定的標籤被允許
  • 對於每一個標籤,你可以定義其特定的屬性被允許

基本上,這個想法是隻保留你指定的(白名單),而不是試圖刪除使用黑名單的壞東西(這永遠不會完全)


如果您只指定了一個無害的標籤和屬性列表,那麼只會保留這些標籤和屬性 - 而且注入的風險會降低很多。


報價HTMLPurifier的主頁:

HTML淨化器是用PHP編寫的符合標準的HTML 過濾庫。
HTML淨化器,不僅將解除 所有惡意代碼(更好地稱爲 XSS)有一個徹底的審計, 安全又寬容的白名單,它 也將確保您的文檔 符合標準,有些事只有 一個全面實現有關W3C規範的知識。

是的,另一件好事是您輸出的代碼有效



當然,這樣只會讓你清洗/過濾/淨化HTML輸入;它將不會允許您驗證用戶使用的URL是否都是:

  • 正確;即指向一個真實的內容
  • 「確定」由您的網站定義;即,例如沒有裸露,...


關於第二點,沒有多少人能做些什麼:最好的解決方法是將兩種:

  • 有一個主持人接受/拒絕內容之前,他們投入在線
  • 給網站的用戶一種方式來標記一些不適當的內容,所以主持人採取行動。

基本上,檢查視頻的內容本身,沒有太多的選擇,但有一個人說:「OK」或「不正常」。


關於第一點,不過,還有希望:一些服務主機內容有API的,你可能想/可以使用。例如,Youtube提供API - 參見Developer's Guide: PHP

在你的情況下,Retrieving a specific video entry部分看起來很有希望:如果你發送一個HTTP請求,看起來像這樣的URL:

http://gdata.youtube.com/feeds/api/videos/videoID 

(由視頻的ID更換「視頻ID」,當然)

如果視頻有效,您將獲得一些ATOM供稿;和「無效的ID」,如果它不是

這可能會幫助您驗證至少一些網址的內容 - 即使您將不得不爲您的用戶喜歡的每個可能的內容託管服務開發一些特定的代碼...


現在,從HTML字符串中提取視頻的標識符...如果你想使用正則表達式,你就錯了;-)

從一個HTML字符串中提取數據的一部分最好的解決方法通常是:

  • 負載使用DOM解析器的HTML; DOMDocument::loadHTML一般是很有幫助的,在這裏
  • 儘管文檔使用DOM方法;或者,根據您的情況:

而且使用DOM也可以讓您使用標準的API來修改HTML文檔 - 它可能會幫助,如果你要新增一些消息,視頻,或任何其他東西一樣, 。

+0

'DOMDocument'如果不是那麼麻煩,並且完全支持'UTF-8',它看起來好像是爲'XML'而不是'HTML'構建的,我建議使用[html5lib](https:而不是.github.com/html5lib) – 2014-03-26 19:10:24

0

這永遠不會安全。瀏覽器有那些有趣的小功能,可以幫助人們顯示他們頁面的內容,即使html很混亂。有無數的機會去打通:)

檢查here看到的東西的冰山一角

什麼,你需要做的是使用一個單一的輸入只是一個寬度和高度以及過濾器鏈接和aditional的投入那些。然後生成自己的對象標籤。

This might be safe。

1

我已爲此工作的公司實施了此算法。它工作得很好。但是,實施起來相當複雜。

我肯定會檢查出HTMLPurifier,看看它是否以一種簡單的方式爲你工作。如果你堅持做下去的老派路像我一樣,這是基本的步驟:

1. 的==>獲得友好與stripos()

2. 首先你必須做的遞歸函數來確定啓動和停止的標籤窗口小部件,它包括的<embed></embed><embed/>(自閉合)或<object></object>所有組合......或<object><params>...<embed/></object>

3. 在這之後,你必須分析出所有屬性,而params 。

4. 現在,所有<object>標籤應該有<param>標籤作爲子元素。您必須解析所有這些才能獲取所需的所有數據,以便最終生成新的嵌入或對象標記。尤其是,高度,數據源所包含的參數和屬性非常重要。

5。 現在,您不知道屬性是否由單引號或雙引號括起來,因此您的代碼必須以這種方式寬鬆。另外,你不知道代碼是否有效或者格式良好。所以,它應該能夠處理嵌套的嵌入/對象標籤,嵌入的標籤沒有正確包含等等等等。因爲它是用戶生成內容,你不能真正瞭解和信任輸入。你會看到有很多組合。

6. 如果您管理其所有屬性(或對象元素及其子PARAMS)來解析嵌入式元素,域的白名單是很容易...

我的代碼結束了約爲800代碼行非常大,並且充滿了遞歸方法,找到了正確的停止標記和結束標記等。我的alghorithm還刪除了所有經常包含在剪切內容中的SEO文本 - 粘貼嵌入代碼,如鏈接返回到持有小部件的網站。

它是一個很好的運動,但如果我在哪裏你......不要開始走這條路。

推薦:試試找一些現成的,開源的!

0

最簡單和優雅的解決方案:Allowing HTML and Preventing XSS @ shiflett.org。
使用各種「HTML淨化器」是毫無意義的。對不起,但我沒有那些喜歡在更簡單的解決方案手中使用這些臃腫庫的人。

0

如果您正在尋找使您的網站免於漏洞的「安全」,白名單方法是(唯一)的方式去。我會建議安全地轉義所有用戶生成的內容,並且僅列出您知道安全的標記,並在您的網站上運行。這意味着不僅僅是<B>標籤,還包括閃存嵌入。

例如,如果您希望允許嵌入任何YouTube,請編寫驗證RegEx,查找它們生成的嵌入代碼。拒絕接受任何其他人(或僅僅將其顯示爲轉義標記)。這是可測試的。忘掉所有這些解析廢話。

如果您還想添加vimeo視頻,請查看它們提供的嵌入代碼並接受它。

呃?我知道這看起來很痛苦,但事實上,它比一些嘗試以某種通用方式檢測「不良」內容的算法更容易編寫。

得到算法工作的簡單版本後,你可以回去,讓它更好。您可以「暫時」接受不通過白名單的網址,腳本等內容,並且有一個管理流程可將批准的正則表達式添加到輸出轉義例程中。這樣合法用戶不會被冷落,但是你不會因爲這種性質的攻擊而打開自己。

相關問題