爲了有一個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的易受傷害嗎?如果是這樣,如何解決它?
爲什麼不使用*漂白*這是一個建立的圖書館這件事? – Wtower
@Wower我還沒有聽說過!感謝您的介紹。 – Jand
這是要過濾出像'http:// stackoverflow.com/questions/tagged/javascript'這樣的東西,因爲它包含「javascript」?是否會過濾掉'href =「JAVASCRIPT:alert(1);」'(區分大小寫)?數據URL如何處理'data:text/html; base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg =='? – Gray