How to sanitize _before_ going into the database?

I use a call to the sanitize method every time I render some user
input, but it would be much nicer if I could clean it up once before
putting it into the database and avoid having to call the (relatively
expensive) sanitize every time I render a page.

My first thought was to just add something like:

def message=(x)
  self[:message]=sanitize(x)
end

However, the sanitize helper cannot be called from inside a model. So
what would be an elegant way to do this? Stuffing this inside the
controller seems awkward (and I would have to put it in several
places).

Any thoughts?

Although I’m against destructive actions on user entered data (if you sanitize before saving, you can never recover what the user initially entered), there’s a plugin that does just that:

http://agilewebdevelopment.com/plugins/acts_as_sanitized

If you want to do it automatically so you don’t have to call h or sanitize in your views, you could use xss_terminate:

http://agilewebdevelopment.com/plugins/xss_terminate

You could have easily found this yourself by having a quick search at the agilewebdevelopment site:

http://agilewebdevelopment.com/plugins/search?search=sanitize

Best regards

Peter De Berdt

Thank you, I actually did stumble onto the two you mentioned after
writing my original post. But it seems acts_as_sanitized is no longer
maintained and xss_terminate is too destructive for my purpose as it
includes itself in base and strips out everything everywhere unless
you tell it not to. I have a lot of models I would need to go over and
I agree I'm also against destructive actions on user entered data
except for the few cases where it would be a real performance boost.

Instead of installing all kinds of plugins, would there be any problem
in simply doing this inside a model:

include ActionView::Helpers::SanitizeHelper
def message=(x)
  self[:message]=sanitize(x)
end

If you're willing to add fields to your model, you can get around the
destructive action issue simply by storing the original input along
with the sanitized version. Use the unsanitized field in "edit" forms
and display the sanitized field in "show" views. Use a before_save
callback to do the sanitizing during any edit.

So for instance, to clean up user input for a Comment model, have both
comment_text and comment_html fields, then run comment_text through
RedCloth (if you're using textile), white_list (to clip out nasty
tags), and hpricot (to close open tags) and stuff into comment_html
(via a before_save method). Display comment_html but let the user re-
edit comment_text -- which gets cleaned back up and saved in
comment_html.

I released another (Cross Site Sniper) earlier this week…

Peter De Berdt wrote: