diff options
author | Michael Koziarski <michael@koziarski.com> | 2009-10-08 09:31:20 +1300 |
---|---|---|
committer | Michael Koziarski <michael@koziarski.com> | 2009-10-08 09:31:20 +1300 |
commit | 9415935902f120a9bac0bfce7129725a0db38ed3 (patch) | |
tree | 654d184caccfd7e1de4d60236fb7813bf1177d84 /actionpack/lib/action_view/erb/util.rb | |
parent | f27e7ebc0e2a55a268631c78d49a5b70b06ad59a (diff) | |
download | rails-9415935902f120a9bac0bfce7129725a0db38ed3.tar.gz rails-9415935902f120a9bac0bfce7129725a0db38ed3.tar.bz2 rails-9415935902f120a9bac0bfce7129725a0db38ed3.zip |
Switch to on-by-default XSS escaping for rails.
This consists of:
* String#html_safe! a method to mark a string as 'safe'
* ActionView::SafeBuffer a string subclass which escapes anything unsafe which is concatenated to it
* Calls to String#html_safe! throughout the rails helpers
* a 'raw' helper which lets you concatenate trusted HTML from non-safety-aware sources (e.g. presantized strings in the DB)
* New ERB implementation based on erubis which uses a SafeBuffer instead of a String
Hat tip to Django for the inspiration.
Diffstat (limited to 'actionpack/lib/action_view/erb/util.rb')
-rw-r--r-- | actionpack/lib/action_view/erb/util.rb | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/actionpack/lib/action_view/erb/util.rb b/actionpack/lib/action_view/erb/util.rb index 3c77c5ce76..f767a5e27e 100644 --- a/actionpack/lib/action_view/erb/util.rb +++ b/actionpack/lib/action_view/erb/util.rb @@ -15,9 +15,19 @@ class ERB # puts html_escape("is a > 0 & a < 10?") # # => is a > 0 & a < 10? def html_escape(s) - s.to_s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] } + s = s.to_s + if s.html_safe? + s + else + s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }.html_safe! + end end + alias h html_escape + + module_function :html_escape + module_function :h + # A utility method for escaping HTML entities in JSON strings. # This method is also aliased as <tt>j</tt>. # |