2012-09-04 14 views
13

Używam Brakeman do identyfikowania problemów związanych z bezpieczeństwem. Zgłasza linki, które używają params.merge jako luki w zabezpieczeniach skryptów krzyżowych. Jak mogę oczyścić coś takiego jak poniżej?params.merge i wykonywanie skryptów krzyżowych

- @archives.each do |archive| 
    = link_to "FTP", params.merge(:action => :ftp, :archive => archive, :recipient => "company") 

Odpowiedz

15

Należy utworzyć nowy skrót w oparciu o wyłącznie elementów params którego oczekują i pragną, aby umożliwić być częścią łącza FTP i używać że do scalania dodatkowe parametry.

To, co mam, pozwala mi dodać to, co chcę, do tego linku FTP, modyfikując querystring, otwierając drzwi do luk w zabezpieczeniach. Budując hasz do użycia zamiast params w wersji params.merge(..., możesz skutecznie dodawać do białej listy oczekiwane komponenty, które będą używane w renderowanym szablonie.


Jako GET przykład, jeśli oczekujesz URL podobnego

/some/path?opt1=val1&opt2=val2 

swojej akcji kontrolera można zrobić

@cleaned_params = { opt1: params[:opt1], opt2: params[:opt2] } 
@cleaned_params.merge! action: :ftp, archive: archive, recipient: :company 

a następnie przekazać @cleaned_params do link_to

= link_to "FTP", @cleaned_params 

W ten sposób, jeśli ręcznie wprowadzić adres URL jak

/some/path?opt1=val1&opt2=val2&maliciousopt=somexss 

params[:maliciousopt] nigdy nie będzie go do FTPlink_to w widoku.

To samo zachowanie dotyczy POST wniosków, tylko być złośliwy dodam kilka pól do formularza przed złożeniem go

<input type="hidden" name="maliciousopt" value="somexss" /> 
+0

Dzięki ... możesz dać mi przykład? Naprawdę tego nie rozumiem. – snowangel

+0

Zaktualizowałem dla ciebie odpowiedź. – deefour

+0

Całkowicie zadłużony - dziękuję. – snowangel

Powiązane problemy