Как безопасно вывести параметры запроса в Rails, в котором амперсанд не экранирован - PullRequest
1 голос
/ 01 апреля 2020

Рассмотрим следующие параметры запроса

{
  :param1=>"<script>alert('hi')</script>", 
  :param2=>"<script>alert('hi2')</script>"
}

Я хочу безопасно отобразить их как параметры запроса в ссылке. Проблема демонстрируется следующим образом:

[83] pry(main)> params
=> {:param1=>"<script>alert('hi')</script>", :param2=>"<script>alert('hi2')</script>"}
[84] pry(main)> params.to_query
=> "param1=%3Cscript%3Ealert%28%27hi%27%29%3C%2Fscript%3E&param2=%3Cscript%3Ealert%28%27hi2%27%29%3C%2Fscript%3E"
[85] pry(main)> ERB::Util.html_escape params.to_query
=> "param1=%3Cscript%3Ealert%28%27hi%27%29%3C%2Fscript%3E&amp;param2=%3Cscript%3Ealert%28%27hi2%27%29%3C%2Fscript%3E"

Когда params.to_query отображается через ERB, амперсанд также экранируется. Вероятно, вы можете передать их url_for и link_to в качестве параметров запроса, но для целей этого вопроса давайте предположим, что это невозможно.

В моем случае я просто хочу, чтобы сами параметры запроса были безопасно экранированы, но не экранированы от амперсанда.

1 Ответ

0 голосов
/ 01 апреля 2020

Я придумала потенциальное решение, но мне любопытно узнать мнение сообщества:

  def escape_query_params(url)
    # in my case, we have a string that can be parsed as a URI.
    uri = URI.parse(url)

    # then we split the query part across the "&".
    # and return an array that uses the technique in the below article
    # to concat strings starting with a SafeBuffer
    # and then use ActionView's `safe_join` to bring back the & 
    safe_query_params = safe_join(uri.query.split("&").map{|s| "".html_safe + s}, "&".html_safe)
    "".html_safe + uri.path + "?" + safe_query_params
  end

В вышеприведенном примере используется метод из следующей статьи о том, как быть в безопасности с html_safe: https://product.reverb.com/stay-safe-while-using-html-safe-in-rails-9e368836fac1

...