2016-08-19 2 views
0

Для всех моих приложений-приложений: если пользователь отправляет текстовое поле или текстовое поле, содержащее теги <script></script>, то я хочу, чтобы рельсы разделили эти теги перед сохранением ввода данных пользователя в базу данных.Разделите сценарии сценариев перед сохранением в базе данных в рельсах

я уже смотрел на следующие должности, которые все вокруг 5 лет:

Я также посмотрел на следующие документы, но я не понял, как применить их к этой ситуации (удалив тег сценария перед сохранением базы данных):

Пример:

Я scaffold для user ресурса:

rails g scaffold user first_name last_name age:integer bio:text 

Затем пользователь вводит следующее и су bmits это:

user_input

должны быть сохранены в базе данных для каждого атрибута этого user записи следующее:

  • first_name: Foo
  • last_name: Foo
  • Возраст: 5
  • биография: Bazz

Спасибо!

+0

@Ven это просто защитная сетка. В случае, если программист не будет правильно скрываться в представлении, возможно, через запрос AJAX. См. Этот вопрос на примере того, когда программист не убежит должным образом в представлении, и теги сценария сохраняются в базе данных: http://stackoverflow.com/questions/39039731/sanitize-ajax-response-that-updates-options- в-select-box нам больше не нужно беспокоиться об этом, если все теги скрипта удаляются до сохранения. – Neil

+2

Rails убегает для вас. Программист не убегает сам. Это 2016. – Ven

ответ

4

Если вы просто хотите дезинфицировать при рендеринге в HTML, RoR уже поставляется с помощником (http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html), который позволяет автоматически очищать эти теги.

Если вы хотите, чтобы они очищали эти биополя, прежде чем хранить их в своей базе данных, есть драгоценный камень (sanitize), который упростит его. Этот жемчуг позволяет вам настроить те теги, которые вы хотите сохранить (если есть), и черные списки остальных.

- с strong_params вы обычно имеют вспомогательный метод в контроллере, чтобы требуют и разрешений атрибутов.После того, как разрешено, вы могли бы пройти через этот Params и проверить некоторые (или все из них)

# using the sanitize gem 
def sanitize input_field 
    Sanitize.fragment(input_field, Sanitize::Config::RELAXED) 
end 

def sanitize_product_input 
    # product_params = strong_params filter 
    [:first_name, :last_name, :bio].each do |field| 
    product_params[field] = sanitize(product_params[field]) 
    end 
    product_params 
end 

или вы могли бы сделать это немного более общий характер и создать в вашем application_controller нового метод дезинфицировать входы

# using the sanitize gem 
def sanitize input_field 
    Sanitize.fragment(input_field, Sanitize::Config::RELAXED) 
end 

def sanitize_input input_params, fields 
    fields.each do |field| 
    input_params[field] = sanitize(input_params[field]) 
    end 
end 

и использовать его в методах были вы определяете ваши strong_params фильтры

def product_params 
    fields = [:first_name, :last_name, :bio] 
    input_params = params.require(:product).require(fields) 
    sanitize_input(input_params, fields) 
    input_params 
end 
+0

Можете ли вы предоставить код, который применяет камень 'sanitize', чтобы решить предоставленный пример в вопросе? Я хочу дезинфицировать атрибуты 'first_name',' last_name' и 'bio' для этой модели. Но более глобально: я также хочу дезинфицировать ВСЕ текстовые поля для всех форм, чтобы пользователь никогда не мог отправлять теги «

0

Одним из возможных решений является использование sanitize_model_attributes gem

В основном: это переписывает сеттеры для всех атрибутов модели указывается в методе sanitize_attributes так, что он может дезинфицировать каждый атрибута value:

Реализация:

#app/models/user.rb 
class User < ApplicationRecord 
    include SanitizeModelAttributes 
    sanitize_attributes :first_name, :last_name, :bio 
end 

И точно так же, что: все теги html (а не только тег сценария) удаляются до сохранения в базе данных по атрибутам first_name, last_name и bio.

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