2009-10-28 8 views
18

Szukam prostego sanitizer HTML napisanego w JavaScript. Nie musi być w 100% bezpieczny dla XSS.Prosty dezynfektor HTML w JavaScript

Na mojej stronie internetowej wdrażam Markdown i edytor Markdown WMD (gałąź master master od github). Problem polega na tym, że HTML wyświetlany w podglądzie na żywo nie jest filtrowany, tak jak tu na SO. Szukam prostego/szybkiego sanitizer HTML napisanego w JavaScript, dzięki czemu mogę filtrować zawartość okna podglądu.

Nie trzeba pełnego analizatora składni z pełną ochroną XSS. Nie wysyłam danych wyjściowych z powrotem na serwer. Wysyłam Markdown na serwer, na którym używam odpowiedniego, pełnego dezynfekcji HTML, zanim zapiszę wynik w bazie danych.

Google jest absolutnie bezużyteczny dla mnie. Dostaję setki (często niepoprawnych) artykułów o tym, jak odfiltrować javascript z HTML generowanego przez użytkownika we wszystkich językach po stronie serwera.

UPDATE

wytłumaczę nieco lepiej, dlaczego muszę to. Moja strona internetowa ma edytora bardzo podobnego do edytora StackOverflow. W polu tekstowym znajduje się składnia MarkDown, a pod nią okno podglądu, które pokazuje, jak będzie wyglądać po jej przesłaniu.

Gdy użytkownik coś przesyła, jest wysyłany na serwer w formacie MarkDown. Serwer konwertuje go na HTML, a następnie uruchamia na nim sanitizer HTML, aby oczyścić kod HTML. MarkDown zezwala na dowolny kod HTML, więc muszę go wyczyścić. Na przykład użytkownik pisze coś takiego:

<script>alert('Boo!');</script> 

Konwerter MarkDown nie dotyka go, ponieważ jest to HTML. Sanitizer HTML usunie go, więc element skryptu zniknął.

Ale tak nie jest, co dzieje się w oknie podglądu. Okno podglądu konwertuje MarkDown tylko na HTML, ale nie powoduje dezynfekcji. Tak więc okno podglądu będzie miało element skryptu. Oznacza to, że okno podglądu różni się od rzeczywistego renderowania na serwerze.

Chcę to naprawić, więc potrzebuję szybkiego i brudnego sanitizer HTML JavaScript. Coś prostego z podstawową czarną listą elementów i atrybutów. Nie musi to być XSS, ponieważ ochrona XSS jest wykonywana przez sanitizer HTML po stronie serwera.

Ma to na celu upewnienie się, że okno podglądu będzie odpowiadać rzeczywistemu renderowaniu przez 99,99% czasu, co jest dla mnie wystarczająco dobre.

Czy możesz pomóc? Z góry dziękuję!

+3

FWIW, Nienawidzę, gdy podgląd nie pasuje do tego, co zostało opublikowane. – Ms2ger

+1

@ ms2ger: Dlatego potrzebuję sanitizer HTML, aby podgląd był zgodny z tym, co robi serwer na zapleczu. –

+0

Czy to nie problem polegać na tym, że atakujący mogliby przetestować swoje ataki w przeglądarce, podczas gdy nie widzisz żadnej z nich? – siukurnin

Odpowiedz

9

Trzeba spojrzeć na rekomendowany w tej kwestii Sanitize/Rewrite HTML on the Client Side

I po prostu mieć pewność, że nie trzeba robić więcej o XSS, należy zapoznać się z odpowiedzi na ten How to prevent Javascript injection attacks within user-generated HTML

+1

Caja wygląda użytecznie, ale ciężko. Będę musiał sprawdzić, czy jest wystarczająco szybki. Wątpię w to. Jestem pewien, że jestem bezpieczny od XSS, ponieważ przetwarzany przeze mnie kod HTML nigdy nie jest wysyłany na serwer. Wysyłam oryginalny Markdown. Kod HTML, który muszę oczyścić, jest tylko podglądem i nikt, oprócz użytkownika, który go pisze, nigdy go nie zobaczy. –

-1

dla mojej funkcji dbałem tylko o to, aby ciąg nie był pusty i zawierał tylko znaki alfanumeryczne. Wykorzystuje to zwykły JS i nie ma żadnych trzecich bibliotek ani nic takiego. Zawiera długie wyrażenie regularne, ale spełnia swoją funkcję;) Możesz na tym zbudować, ale twój regex będzie czymś bardziej podobnym '< skrypt> | </script> '(ze znakami unikniętymi w razie potrzeby i minus spacje).;)

var validateString = function(string) { 

     var validity = true; 

     if(string == '') { validity = false; } 

     if(string.match(/[ |<|,|>|\.|\?|\/|:|;|"|'|{|\[|}|\]|\||\\|~|`|!|@|#|\$|%|\^|&|\*|\(|\)|_|\-|\+|=]+/) != null) { 

      validity = false; 
     } 

     return validity; 
    }