2015-09-04 35 views
1

爲了有一個Django應用程序的文本字段的簡單和安全的編輯,我有這樣的片段淨化輸入HTML到Django的代碼:該消毒劑是否容易受到XSS?

from bs4 import BeautifulSoup 

def sanitize_html(value): 
    tag_whitelist = ['img','b','strong','blockquote', 'a'] 
    attr_whitelist = ['src', 'alt', 'width', 'height', 'href','class'] 
    soup = BeautifulSoup(value) 
    for tag in soup.find_all(): 
     if tag.name.lower() in tag_whitelist: 
      tag.attrs = { name: value for name, value in tag.attrs.items() 
       if name.lower() in attr_whitelist } 
     else: 
      tag.unwrap() 

    # scripts can be executed from comments in some cases 
    try: 
    comments = soup.find_all(text=lambda text:isinstance(text, Comment)) 
    for comment in comments: 
     comment.extract() 
    except: 
    pass 
    return unicode(soup) 

我也被列入黑名單使用這種方法進入示範田javascript

BADLIST = ['javascript'] 

def no_js (text): 
    if any(e in text for e in BADLIST): 
     raise ValidationError("Your text contains bad words!") 
    else: 
     return True 

另一方面,在模板中,我需要使用{{text| safe}}來允許顯示健康的html標籤。

所以我想知道這些約束,其輸入仍然是XSS的易受傷害嗎?如果是這樣,如何解決它?

+1

爲什麼不使用*漂白*這是一個建立的圖書館這件事? – Wtower

+0

@Wower我還沒有聽說過!感謝您的介紹。 – Jand

+1

這是要過濾出像'http:// stackoverflow.com/questions/tagged/javascript'這樣的東西,因爲它包含「javascript」?是否會過濾掉'href =「JAVASCRIPT:alert(1);」'(區分大小寫)?數據URL如何處理'data:text/html; base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg =='? – Gray

回答

1

在乍一看代碼看起來不錯,但檢查安全漏洞的東西不要掉以輕心,需要一點時間投資來檢查你自己的。

例如,如果測試提供一個字符串,如<script>alert('hello')</script>被執行。除了這個簡單的測試,還有很多事情要檢查。關於這件事有很多文件。

此外,正如我在評論中提及,我會強烈建議您使用建立庫消毒輸入。這樣的庫是bleach

bleach是一個基於白名單的HTML消毒和文本鏈接庫。它被設計爲用不可信用戶輸入一些HTML。

由於漂白劑使用html5lib解析文檔片段以同樣的方式做的瀏覽器,這是非常有彈性對未知的攻擊,遠遠超過了基於正則表達式的消毒劑。

這樣,您至少可以確信您的攻擊面更小,因爲此軟件經過了更多測試,您只需擔心您允許使用的HTML標籤,而不是您的代碼工作。

用例:

import bleach 
mystring = bleach.clean(form.cleaned_data['mystring'], 
         tags=ALLOWED_TAGS, 
         attributes=ALLOWED_ATTRIBUTES, 
         styles=ALLOWED_STYLES, 
         strip=False, strip_comments=True) 
+0

因此,在上面列出標籤和attrs的白名單時,在保存文本之前應用漂白劑會使'{{text |安全}}對XSS完全安全? – Jand

+0

不一定,取決於你允許的內容。默認的'ALLOWED_TAGS','ALLOWED_ATTRIBUTES'和'ALLOWED_STYLES'是非常嚴格和安全的。 – Wtower

1

這可能是不安全的。 BeautifulSoup默認使用lxml.html解析器,並且可能會利用它與瀏覽器的解析器(遵循HTML規範)之間的差異來偷偷瀏覽器將看到的元素作爲元素,但代碼不會。使用BeautifulSoup和html5lib可以緩解這種可能的攻擊面,因爲那時你的解析器與瀏覽器相同。

你可能不希望允許寬度,高度和類,因爲這將允許攻擊者使他們的形象在整個頁面的大小。

不過,在一般情況下,我會Wtower的答案同意,用規定的第三方庫可能是更安全的。