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 < 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 BlueClothNastę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>

Kanały IRC![[Dilber w Onecie]](/images/larry.png)


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: ale nie każdy o tym wie.