Ссылка на текущую страницу с разными локалями
Проверено на рельсах 4
Привет всем.
После некоторого времени исследований я решил написать собственное решение для этого.
link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' )
Это прекрасно работает, но допускает Уязвимость XSS , просто передающую параметры в ваш URL, как показано ниже:
http://localhost:3000/en/about?host=www.fishingsiteorbadurl.com/%23&port=80
Или в худшем случае:
http://localhost:3000/en/about?host=%D0%BE%D1%87%D0%B5%D0%BD%D1%8C%D0%BF%D0%BB%D0%BE%D1%85%D0%BE%D0%B9%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84
Проверьте, какие URL вы получите после перехода по этой ссылке в вашем приложении.
Мое производственное решение.
Метод "изменить язык" перенаправляет на любую страницу с правильным языком, просто используя HTTP_REFERER в объекте запроса.
Обратите внимание: метод URI.path для получения только пути, а не целого URL
Сделать метод "изменить язык" в любом контроллере:
def change_lang
if request.referer.nil?
refer = root_url
else
uri = URI(request.referer)
refer = uri.path
end
lang = params[:lang]
cookies[:locale] = lang
redirect_to refer
end
application_controller.rb
before_action :set_locale
def set_locale
# -- Get lang from cookies or url parameter locale
user_locale = cookies[:locale] || params[:locale]
# -- If present
if user_locale.present?
# -- If it is has 2 symbols
user_locale = user_locale.scan(/[a-zA-Z]{2}/)
else
# -- If no - use default en locale
user_locale = 'en'
end
# -- Check, is this locale available for using.
# Please note: this needed for disable invalid locale warning.
if I18n.available_locales.include?(user_locale[0].to_sym)
I18n.locale = user_locale[0]
else
I18n.locale = "en"
end
end
добавить это в свой макет
<%= link_to 'English', change_lang_path('en') %> <%= link_to 'Russian', change_lang_path('ru') %>
конфиг / routes.rb
scope "(:locale)", locale: /[a-zA-Z]{2}/ do
get "change_lang/:lang" => "users#change_lang", :as => "change_lang"
end
Нет необходимости использовать params.merge или любое другое решение.
Надеюсь, это поможет, потому что я лично потратил много времени на его решение.