Params.merge и межсайтовый скриптинг

Я использую Brakeman для выявления проблем безопасности. Он помечает любые ссылки, которые используют params.merge как уязвимость сценариев межсайтового сайта. Как я могу дезинфицировать что-то вроде следующего?

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

Ответ 1

Вы должны создать новый хеш на основе только тех элементов params, которые вы ожидаете, и хотите разрешить быть частью ссылки FTP и использовать , которые, чтобы объединить ваши дополнительные параметры.

Что вы позволите мне добавить все, что захочу, к этой ссылке FTP, изменив запрос, открыв дверь для уязвимостей безопасности. Создав хеш для использования вместо params в params.merge(..., вы эффективно переименовываете ожидаемые компоненты запроса для использования в создаваемом вами шаблоне.


Как пример GET, если вы ожидаете, что URL-адрес, например

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

действие вашего контроллера, которое вы могли бы сделать

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

И затем передайте @cleaned_params в link_to

=  link_to "FTP", @cleaned_params

Таким образом, если я вручную укажу URL, например

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

params[:maliciousopt] никогда не попадет в ваш FTP link_to в вашем представлении.

Такое же поведение относится к запросам POST, только для того, чтобы быть злым. Я могу добавить пару полей в форму перед отправкой.

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