2016-05-12 2 views
0

Для введенных пользователем данных Я использую подход к его дезинфекции перед сохранением, чтобы удалить любой 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 

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

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

Спасибо!

+0

Вы не должны так беспокоиться об удалении тегов. Если пользователь вводит «» 'в поле, они ожидают увидеть теги, отображаемые как текст – meagar

+0

Я работал над smth, как это, и закончил с MarkDown. Гораздо холоднее и чище. – 7urkm3n

ответ

2

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

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

+0

Спасибо за ваш ответ. Я согласен, что я должен удалить свою предварительную санитацию. Но тогда как бы я визуализировал «» & 'как' some & stuff '. У меня есть экземпляры, где '&' хранится как '&'. – cman77

+0

Могу ли я обернуть его в 'CGI.unescapeHTML'? – cman77

+0

То, что я собирался предложить, вы избили меня. Было бы непрактично запускать сценарий обратной засыпки в автономном режиме, чтобы отменить существующие данные и сохранить их обратно в db? Это был бы мой предпочтительный подход, тогда вам не нужно беспокоиться о том, чтобы выяснить, была ли она дезинфицирована или нет. В противном случае вам нужно оставить беспорядочные инструкции 'if', чтобы переключиться, если вы действительно хотите unescape или нет. –

1

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

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

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

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

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