Kaip ir žadėjau, pratęsiu straipsniuką apie Ruby on Rails saugumą. Vakar rašiau apie SQL Injekcijas, šiandien papasakosiu apie Cross Site Scripting (CSS/XSS) pažeidžiamumus.

Beveik visos web aplikacijos naudoja sesijas vartotojų sistemose. Sesijos talpinamos sausainėliuose (cookies). Pagal sausainius identifikuojami vartotojai, jiems priskiriama sesijos informacija (@session). Dažniausiai sesijoje yra prisijungusio vartotojo ID, vardas ir pan.

Cross Site Scripting yra sausainėlių ‘vogimo’ technika iš kito svetainės lankytojo. Sausainėliai yra prieinami tik iš to domeno, kur jie buvo sukurti. Lengviausias būdas gauti priėjimą prie sausainio, tai įdėti kenksmingo JavaScript kodo į pažeidžiamą puslapį, jis nuskaitys sausainį ir jį perduos ‘blogiečiui’, pvz.: per URL parametrus į kitą puslapį.

Atakos pavyzdys

Puslapis su toliau esančiu Eruby šablonu turi XSS pažeidžiamumą:
<%= @params['text'] %>

“text” parametras yra tiesiogiai įterpiamas į puslapį, todėl galima su JavaScript kodu pamatyti sausainius pvz.:

<script>alert(document.cookie)</script>

Užkoduotą skriptą (pvz. su CGI.encode) hakeris gali įdėti į adresą ir duoti vartotojui atsidaryti jį per naršyklę.
Jei atsidarysit adresą
http://puslaspis.domenas/controller/action?text=%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E
Jums iššoks popup langas su sesijos sausainėliu. Vietoje tokio alert’o galima padaryti jog sesijos id būtų nusiųstas ir į kitą serverį.

Kaip apsisaugoti ?

Taigi, akivaizdu jog sėkmingai įvykdyti ataką galima tiesiog įdėjus JavaScript į puslapį, kuris turi sesijų sausainėlius. Tai gali būti blogas su komentarais, forumas, Wiki ir pan. Kaip apsisaugoti ? Paprasčiausias būdas yra kiekviename stringe, kuris yra įrašomas iš išorės, HTML meta simbolius (”<" ir ">“) paversti į analogišką reikšmę turinčias HTML simbolių reikšmes (entities) (”<” ir “>”). Taip jūs būsite tikri, kad ir koks tekstas bus įvestas formoje ar pridėtas per URL, naršyklė visada atvaizduos paprastą tekstą ir į kodą nereaguos kaip į html. Tai taip pat gerai, kadangi vartotojas palikęs tarkim > tagą gali sujaukti jūsų template ir panašiai, taip pat būtinai įsitikinkite ar “<", ">” keičiami į “<” ir “>”.

Rails turi pagalbinę funkciją h() HTML meta simbolių konvertavimui peržiūrėjime.

Pvz:
<%=h post.subject %>
<%=h post.text %>

Jūs turėtumėt visur naudoti h() atvaizduodami duomenis puslapyje, nesvarbu net jei jūs manote jog duomenys patikimi.

Dar kartą ačiū už informaciją Agile Web Development with Rails ir Ruby on Rails.

Jei turit pastabų ar klausimų komentuokit!

Panašūs straipsniai


“Ruby on Rails dienoraštis - 4 diena” komentarų: 2

  1. Anonymous coward =)

    Ehm… Tai ties 4′ta diena viskas ir pasibaige? =)

  2. asterisk

    atostogos ir laiko trūkumas padarė savo, bet neužilgo bus ir 5 diena :)

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.