2009-02-01 9 views
5

Teraz wpadłem w jakąś głupią sytuację. Chcę, aby użytkownicy mogli korzystać z materiałów tekstylnych, ale nie powinni zawracać sobie głowy moim poprawnym kodem HTML przy ich wpisie. Więc jakoś muszę uciec z HTML.W jaki sposób mogę tekstylować i odkażać html?

  • html_escape(textilize("</body>Foo")) złamie włókienniczych podczas

  • textilize(html_escape("</body>Foo")) będzie działać, ale łamie różne funkcje tekstylne takie jak linki (napisany jak "Linkname":http://www.wheretogo.com/), gdyż notowania byłyby przekształcone &quot;, a tym samym nie zostały wykryte przez włókienniczych więcej.

  • sanitize nie wykonuje lepszej pracy.

Jakieś sugestie na ten temat? Wolałbym nie używać do tego problemu Tidy. Z góry dzięki.

Odpowiedz

7

Dla tych, którzy mają ten sam problem: Jeśli używasz RedCloth gem, możesz po prostu zdefiniować własną metodę (w jednym z twoich pomocników).

 
def safe_textilize(s) 
    if s && s.respond_to?(:to_s) 
    doc = RedCloth.new(s.to_s) 
    doc.filter_html = true 
    doc.to_html 
    end 
end 

Wyciąg z dokumentacji:

dostępowe do ustawiania ograniczenia zabezpieczeń.

To dobrze, jeśli używasz RedCloth do formatowania w miejscach publicznych (np. Wikis), w których nie chcesz, aby użytkownicy nadużyli HTMLa na złe rzeczy.

Jeśli ustawiono filter_html, kod HTML, który nie został utworzony przez procesor tekstylny, będzie oznaczony jako . Alternatywnie, jeśli ustawiono sanitize_html, HTML może przejść przez procesor tekstylny , ale nieautoryzowane znaczniki i atrybuty zostaną usunięte.

+1

Ale uważaj na exploity pre i code tag. na przykład. (czy ryzykuję tego?)

!!!!mouse trap!!!!

0

Wygląda na to, że tekstylia po prostu nie obsługuje tego, co chcesz.

Naprawdę chcesz zezwolić tylko na starannie kontrolowany podzbiór HTML, ale tekstylia są zaprojektowane tak, aby umożliwić dowolny kod HTML. Nie sądzę, aby w ogóle można było używać tekstyliów (chyba że popiera to ograniczenie).

Potrzebna jest prawdopodobnie specjalna "ograniczona" wersja tekstyliów, która pozwala tylko na "bezpieczne" znaczniki (co jednak może być trudne). Nie wiem, czy to istnieje.

Możesz rzucić okiem na BBCode, który pozwala ograniczyć ewentualne znaczniki.

+0

Jest także Markdown (z którego korzysta Overflow Stack), http://daringfireball.net/projects/markdown/ –

+0

Tak, myślałem także o przecenach. Ale AFAIK stackoverflow robi dodatkowe ucieczkę (jakaś uwaga na blogu Jeffa). Markdown pozwala także na dowolny kod HTML. –

+0

@David Zaslavsky: Przeczytaj z oficjalnej strony internetowej (http://daringfireball.net/projects/markdown/syntax#overview): "W przypadku każdego znacznika, który nie jest uwzględniony w składni Markdown, po prostu używasz samego HTML." – Vanuan

2

Działa to dla mnie i osłon przed każdym atakiem XSS Próbowałem tym onmouse ... koparki w przedszkolach i kodu bloków:

<%= RedCloth.new(sanitize(@comment.body), [:filter_html, :filter_styles, :filter_classes, :filter_ids]).to_html -%> 

Początkowy Sanitize usuwa wiele potencjalnych XSS exploity łącznie mouseovers.

O ile mogę powiedzieć: filter_html wymyka się większości znaczników html poza kodem i pre.Pozostałe filtry są dostępne, ponieważ nie chcę, aby użytkownicy stosowali klasy, identyfikatory i style.

właśnie testowane moją stronę komentarzy z Twojego przykład

"</body>Foo" 

i całkowicie usuwa fałszywe tag ciała

używam wersji 4.2.3 RedCloth i szyn wersji 2.3.5

Powiązane problemy