2016-12-07 2 views
0
class ApplicationController < ActionController::Base 
.... 

    def sanitize(value) 
    ActionController::Base.helpers.sanitize(value.try(:strip)).gsub('&amp;', '&').gsub('&gt;', '>').gsub('&lt;', '<') if value.present? 
    end 

end 

и в ресурсеНужно ли нам явно дезинфицировать сильные параметры в рельсах?

class UsersController < ApplicationController 
... 
def update 
    if current_user.update(update_users_params) 
    redirect_to root_path 
    end 
end 

private 


def update_users_params 
    params.require(:user).permit(username: sanitize(params[:user] [:username]), 
        location: sanitize(params[:user][:location])) 
end 

здесь расположение и имя пользователя являются модели пользователя атрибуты.

Фактическое поведение без использования метода дезинфицировать:

если добавить "Hey <script type='text/javascript'> alert('Hi') </script>" к имени пользователя или местоположения в поле ввода пользовательской формы, после отправки формы он хранится, как это

"Hey <script type='text/javascript'> alert('Hi') </script>" 

мы должны дезактивировать эти атрибуты для тегов скриптов перед сохранением в базе данных? и

ли сильные параметры не будут дезинфицировать теги сценариев из этих атрибутов?

ответ

0

Rails сохранит вход как есть, но он всегда будет избегать его при работе с ним.

Вам нужно будет явно позвонить raw или html_safe для строк unsanitized (html/script).

+0

Это правда, но что делать, если вам нужно обслуживать сохраненный результат на других платформах, таких как служба API, которая служит для Android или IOS. – Jaswinder

+0

Просто зависит от того, как вы его передаете. Если вы просто передали 'params [: my_param_name]' API/службе, по умолчанию он будет экранирован. – codyeatworld

+0

Нет, он не будет экранирован по умолчанию. – Jaswinder

Смежные вопросы