Unikanie niebezpiecznych danych w szablonach RHTML

Posted by Jarosław Zabiełło Mon, 25 Dec 2006 00:14:00 GMT

W wypadku treści wyświetlanych w szablonach najlepiej zachować zasadę ograniczonego zaufania. Np. jeśli wyświetlamy zawartość komentarzy które ktoś wysłał z formularza, to przy odrobinie złośliwości i/lub głupoty taki użyszkodnik może nam wysłać kod HTML lub JavaScript, który popsuje spójność naszej strony. Generalnie istnieje kilka metod aby się przed tym zabezpieczyć.

  • Wszelkie treści podejrzane o możliwość wysłania kodu HTML wyświetlaj przez funkcję filtrującą html_escape() (lub w skrócie: h) Czyli zamiast <= jakies_dane %> należy używać <=h jakies_dane %> i dobrze aby ten zwyczaj wszedł nam w krew. Dzięki temu helperowi wszelkie dane zawierające znaczniki zostaną wymienione na encje HTML (np. zamiast < będzie &lt; co w efekcie uniemożliwi interpretację takich znaków jako tagów HTML)]
  • W wypadku kiedy potrzebujemy kodu HTML, ale nie chcemy aby zawierał ukryte wstawki w języku JavaScript, dane filtrujemy przez funkcję sanitize(). Wszystkie akcje onXXX oraz linki zaczynające się od javascript: powinny zostać usunięte.
  • W wypadku kiedy chcemy udostępnić użyszkodnikom możliwość wprowadzania treści z możliwością formatowania tekstu, zamiast HTML można udostępnić im możliwość wprowadzania tekstu w formacie Markdown (BlueCloth) lub Textile (RedCloth). To specjalny, uproszczony sposób formatowania tekstu, który jest zamieniany na bezpieczny i dobrze sformułowany kod HTML. Rails posiada wbudowane helpery do ich obsługi (są zdefiniowane w module ActionView::Helpers::TextHelper)
  • Ostatecznie można wyciąć wszystkie znaczniki HTML za pomocą helpera strip_tags().

Aby Rails mógł używać helpery textilize() i markdown() trzeba je doinstalować

gem install RedCloth
gem install BlueCloth

Następnie w pliku config/environment.rb dodać kod:

  require_gem 'RedCloth' 
  require_gem 'BlueCloth'

Przykład użycia:

<%= textilize '"Polskie forum":http://forum.rubyonrails.pl dla RoR.' %>
<%= markdown 'Strona Rubiego [po polsku](http://ruby-lang.org/pl).' %>

Wygenerowany kod HTML:

<p><a href="http://forum.rubyonrails.pl">Polskie forum</a> dla RoR.</p> 
<p>Strona Rubiego <a href="http://ruby-lang.org/pl">po polsku</a>.</p>

Posted in  | Tags  | 1 comment

Comments

  1. Avatar Drogomir said about 1 hour later:
    Dobrze, że poruszyłeś ten temat – rzadko mówi się o bezpieczeństwie w aplikacjach webowych (albo notorycznie omijam artykuły na ten temat ;). Ja bym do tego jeszcze dodał, że należy uważać nie tylko na to co wyświetlamy, ale też na dane, które dostajemy – na szczęście w railsach jest:
    :conditions => ["column = ?", value]
    ale nie każdy o tym wie.

(leave url/email »)

   Comment Markup Help Preview comment