2011-12-29 5 views
5

Wiem, że wiele pytań na temat sanitizerów HTML pojawiło się w SO, ale nie wiem, czy robią to, co chcę, mam trochę bałagan, ponieważ niektóre z zalecanych podejść mają więcej niż 4 lata.Sanitizer HTML w ASP.NET MVC, który filtruje niebezpieczne znaczniki, ale pozwala na resztę

Mam stronę z edytorem TinyMCE. Oczywiście ten edytor wysyła kod HTML do serwera i oczekuje HTML, więc utworzyłem obiekt z właściwością String ozdobioną atrybutem [AllowHtml]. To dobrze działa.

Teraz chcę się upewnić, że nikt nie próbuje wysłać znacznika <script>, ani <img onerror="">, ani w jaki inny sposób wykonać JS, lub dodać CSS wskazujący zewnętrzne adresy URL.

Jakie jest obecnie najlepsze rozwiązanie?

WPL ma bibliotekę HtmlSanitizationLibrary, ale skąd mogę wiedzieć, które tagi są uważane za "bezpieczne"?

WPL nie wydała niczego od kwietnia ubiegłego roku, a była to wersja beta. Zastanawiałem się, czy ten projekt jest aktywny?

Pozdrawiam.

+0

Jest nadal aktywny. Sanitizer jednak, cóż, obecnie marnieje. Gdy ludzie przenieśli się do XHTML, środek dezynfekujący nie nadawał się do pracy, a przepisanie nie znajduje się na stole. Ponieważ TinyMCE generuje poprawne oznaczenia XHTML, możesz użyć Linq2Xml do zapytania DOM i odkażenia do treści serc. To prawdopodobnie lepsze długoterminowe rozwiązanie (i, hmm, daje mi pomysł na blog lub dwa). – blowdart

Odpowiedz

2

WPL jest standardem de facto. Przeprowadź przez nią ciąg znaków i możesz go bezpiecznie wydrukować:

+0

Tak, używam już metody Html.Raw. Ale moje pytanie brzmi, które tagi/atrybuty są rozłożone w dół? – vtortola

+0

@vtortola, ''

2

AntiXss/WPL jest teraz "wycofanym z użycia". Znaleziony tej biblioteki w a reply gdzie indziej:

HtmlSanitizer, biblioteki .NET do czyszczenia fragmentów HTML z konstruktami, które mogą prowadzić do ataków XSS.

Strona projektu: https://github.com/mganss/HtmlSanitizer

0

Yo prawdopodobnie powinien udać się na białej liście oparte HTML dezynfekujący, który rzeczywiście rozumie dokumentów HTML. Używanie wyrażeń regularnych zazwyczaj nie jest uważane za bezpieczne.

Powodem nieużywania AntiXss Microsoftu jest to, że nie można egzekwować bardziej szczegółowych zasad, takich jak to, co robi się z tagami. Powoduje to całkowite usunięcie tagów, gdy na przykład ma sens zachowanie treści tekstowej. Ponadto nie wydaje się już być utrzymywane.

HtmlRuleSanitizer pozwala zdefiniować strategię sanitarnych aby dokładnie dopasować oczekiwać HTML wygenerowany przez edytor w następujący sposób:

var sanitizer = new HtmlSanitizer(); 
sanitizer.Tag("strong").RemoveEmpty(); 
sanitizer.Tag("b").Rename("strong").RemoveEmpty(); 
sanitizer.Tag("i").RemoveEmpty(); 
sanitizer.Tag("a").SetAttribute("target", "_blank") 
    .SetAttribute("rel", "nofollow") 
    .CheckAttribute("href", HtmlSanitizerCheckType.Url) 
    .RemoveEmpty(); 

string cleanHtml = sanitizer.Sanitize(dirtyHtml); 

Użyć predefiniowanego strategię sanitarnych.