Rails дезинфицирует ввод пользователя

Для данных, вводимых пользователем, я использую подход к его очистке перед сохранением, чтобы удалить любой HTML или что-либо вредоносное (например, теги).

у меня есть before_validation Перезвоните:

before_validation    :sanitize_fields

def sanitize_fields
  full_sanitizer = Rails::Html::FullSanitizer.new
  white_list = Rails::Html::WhiteListSanitizer.new

  # Only text allowed
  self.fname = full_sanitizer.sanitize(self.fname)
  self.lname = full_sanitizer.sanitize(self.lname)
  self.company = full_sanitizer.sanitize(self.company)

  # Some HTML Allowed
  self.description = white_list.sanitize(self.description)
end

Проблема, с которой я сталкиваюсь, заключается в том, что при сохранении чего-то вроде "Smith & Company" в качестве имени оно сохраняется в БД как Smith & Company, Не проблема сама по себе, но тогда она также отображается как Smith & Company в виде редактирования формы, что кажется смешным и запутанным для конечного пользователя.

Есть ли лучший способ, чем подход, который я использую? Это "пахнет" неправильно для меня.

Спасибо!

2 ответа

Решение

Если вы уверены, что данные очищены, вы можете объявить их html_safe во взглядах, чтобы избежать его появления как &; он будет отображаться точно так, как предусмотрено.

Это, конечно, вызывает вопрос: вместо того, чтобы перепрыгивать через обручи для предварительной очистки, а затем сообщать представлению о том, что оно было обработано, почему бы просто не позволить представлению очистить строки, как это происходит по умолчанию? Если вы визуализируете строку "<tag>some_stuff</tag>" в представлении, это избежит этого для вас. Вы обеспокоены тем, что неанизированная строка появляется в другом месте, кроме того, которое находится под вашим контролем?

Причина, по которой он пахнет неправильно, заключается в том, что это так.

За исключением возможного рендеринга больших текстовых блоков (разметки и т. Д.) В html, я бы не стал таким образом обрабатывать данные вашей модели. Следуя рекомендациям, вы сможете защитить себя от внедрения SQL-кода. По умолчанию вывод текста в представлениях будет отображаться безопасным способом.

Если вам нужно разрешить пользователям вводить html, санируйте его при выводе (на ваш взгляд), а не при вводе.

Разделение проблем - одна из причин, но самая большая из них - то, что вы пытаетесь сделать, это просто не идиоматические рельсы. Если вы решили продолжать идти по этому пути, вы будете постоянно бороться с рамками.

Другие вопросы по тегам