Chciałbym rozwinąć tutaj jeszcze wątek sinatry, bo w zasadzie do tej pory było kilka dziur w kilku różnych miejscach, więc można się pogubić.
Najpoważniejsza dziura, czyli ta w XML parserze nie powinna być problemem o ile ktoś nie używa ActionPacka do parsowania XMLa w sinatrze.
Kolejna dziura to możliwość przekazania hasha z opcjami do metod find_by_*. Np.
User.find_by_token(params[:token])
w tym przypadku można przekazać w params[:token] hasha, który będzie zinterpretowany jako opcje. Dziura może być wykorzystana, ale nie jest tak poważna jak inne, bo musi być spełnionych kilka założeń, więcej o tym tutaj: http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/ Pomimo tego ActiveRecord powinen być zupdate’owany do najnowszej wersji - nie wiadomo czy to jest jedyny atak, który można przeprowadzić tym sposobem.
No i ostatnia dziura, find_by_* (także where() ) wersja druga:
User.find_by_token(['foo', nil])
Jeżeli atakującemu uda się przekazać tablicę z nilem, to może wykonać zapytanie, które sprawdzi obecność NULL w bazie tam gdzie tego byśmy nie chcieli. Tą dziurę jest dużo łatwiej wykorzystać niż poprzednią (prawdopodobnie większość resetów haseł i różnych innych rzeczy z tokenami jest podatnych), ale na to aplikacje sinatry powinny być odporne. Jednym ze sposobów wykorzystania tego w railsach jest przesłanie np. takich parametrów:
id[]=1;id[]=nil
które w railsach zamienią się na “id” => [1, nil]. Jeżeli chodzi o sinatrę, to na szczęście tam nie ma żadnego rzutowania, więc dostaniemy {“id”=>[“1”, “nil”]}.
Fix dla tego problemu jest w ActionPacku, dlatego tutaj update ActiveRecorda jest niepotrzebny i nic nie da. Warto sprawdzić też czy nie korzystacie z Rack::PostBodyContentTypeParser, w tym wypadku jesteście podatni na tą dziurę, bo tablica [1, null] w JSON, będzie sparsowana do [1, nil] w ruby.