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, санируйте его при выводе (на ваш взгляд), а не при вводе.
Разделение проблем - одна из причин, но самая большая из них - то, что вы пытаетесь сделать, это просто не идиоматические рельсы. Если вы решили продолжать идти по этому пути, вы будете постоянно бороться с рамками.