2015-12-10 55 views
8

W podobnej aplikacji Railsowej udało mi się utworzyć rekurencyjną funkcję sprawdzania skrótu, która następnie uruchamia metodę czyszczenia/fragmentu klejnotów dezynfekcji w celu usunięcia wszystkich elementów HTML z hashów parametrów wejściowych. Użyłem filtra przed w sterowniku application_controller, więc wszystko zostanie wyszorowane w całej aplikacji (jest to duża aplikacja).Jak mogę oczyścić wszystkie parametry wchodzące w aplikację Sinatra?

Backstory: Ataki XSS były możliwe, szczególnie w przeglądarkach IE, ale tak naprawdę po prostu nie chcemy, aby jakiekolwiek z tych rzeczy były zapisywane w bazie danych. Chociaż ostatecznym celem było to, że wyjście JSON go nie zawierało.

Próbowałem zrobić to samo w aplikacji Sinatra (która ma włączone ActiveSupport i JRuby ActiveRecord), ale klej Sanitize nie będzie pakowany, ponieważ ta konkretna aplikacja działa w JRuby z pewnych przyczyn bazy danych. Sanitize potrzebuje Nokogiri, który z kolei potrzebuje Nokogumbo, a ten drugi po prostu nie zbuduje w tym środowisku JRuby.

Próbowałem więc zrobić filtr przedtem w app.rb, używając wbudowanej metody hackowania Rack :: Util, ale to wysadza w powietrze aplikację.

Czy istnieją jakieś alternatywne sposoby myślę o

1) Dezynfekcja wszystkie przychodzące params do (JRuby) Sinatra app

A jeśli nie, w mniejszym opcji:

2) czynią go więc wszystkie JSON, który jest parsowany, oczyszcza wartości z wymienionych list atrybut-wartość JSON?

PS - Część problemu polega na tym, że dołączony lokalny klejnot, który obsługuje wiele parametrów i renderuje JSON, okazuje się niemożliwy do debugowania. Dołączę Pry zarówno do aplikacji hosta, jak i lokalnie połączonego klejnotu, a kiedy spróbuję Wsiąść w Klejnot, nie mogę zobaczyć skrótu params (po prostu pokazuje się jako pusty) - wydaje się, że jest to problem zakres.

+0

Jaki był problem z użyciem 'Rack :: Utils.escape_html' w filtrze before? – matt

Odpowiedz

1

Klej do dezynfekcji nie będzie pakowany, ponieważ ta konkretna aplikacja działa w środowisku JRuby z przyczyn niektórych baz danych. Sanitize potrzebuje Nokogiri, który z kolei potrzebuje Nokogumbo, a ten drugi po prostu nie zbuduje w tym środowisku JRuby.

wydaje źle jak Nokogiri pracuje w JRuby (ma -java specyficzny GEM), spróbuj bundle update nokogiri aby uzyskać Sanitize grać ładnie ...

Więc próbowałem robi przed filtrem app.rb za pomocą Rack :: Util wbudowanej metody ucieczki html, ale to wysadza w powietrze aplikację.

znowu, szkoda. może opublikujesz szczegóły na temat twoich gemów i niepowodzeń, które napotkasz. chociaż moim zdaniem preferowanym rozwiązaniem byłoby uzyskanie czegoś, co działałoby w ramach MRI pracującego pod JRuby - w ten sposób spróbowałbym ponownie użyć Nokogiri.

+0

Udało mi się przekonać Nokogiri do zbudowania z JRuby, ale gemspec klejnotu Sanitize ma również specyficzną zależność od Nokogumbo, ustawioną w wersji 1.4.1, i która nie byłaby zbudowana z JRuby, więc tam zdawało się, że klejnot Sanitize zawodził być opcją. – rcd

+0

powinieneś być bardziej dokładny w pytaniu: * Sanitize potrzebuje Nokogiri, który z kolei potrzebuje Nokogumbo *, który zrozumiałem źle. więc pozostałe opcje tworzą interfejs zgodny z Nokogumbo, np. przy użyciu "natywnego" [analizatora Java w języku Java] (http://java-source.net/open-source/html-parsers) (napisanie rozszerzenia JRuby lub użycie integracji JRuby z obsługą skryptów Java) lub migracji do innej biblioteki zgodnie z podjętą próbą . obie nie są tak naprawdę dla odpowiedzi na SO, ale bardziej z sesji kodowania w świecie rzeczywistym :) – kares

0

Per Sinatra, istnieją 2 dobre sposoby ucieczki. Oba są wymienione na stronie internetowej. http://www.sinatrarb.com/faq.html#escape_html

1) Korzystanie z szafy. Wspomniał o tym, że wysadza aplikację. Czy mógłbyś wyjaśnić więcej? Tymczasem, aby użyć metody rack, możesz użyć poniższego fragmentu kodu. Po oczyszczeniu paramu możesz go użyć.

cleanedParam = Rack::Utils.escape_html(params[:some_param_name]) 

2) Korzystanie Erubis gem. Klejnot jest napisany czystym rubinem. Konfiguracja gem erubis następująco:

require 'erubis' 
set :erb, :escape_html => true 

Gdy to zrobisz, możesz użyć erubis gdy outputing szablon

erb :index 
0

Można iterację każdego z parametrów w params hash i korzystania Rack na escape_html Metoda unikania elementów HTML zawartych w każdym parametrze.

params.each do |p, v| 
    params[p] = Rack::Utils.escape_html(v) 
end 

Dokumentacja escape_html można znaleźć here.