Commit 8c576313963d6be6644af9a2c675927ab7cbd2a1

Authored by Leandro Santos
1 parent fe596c84

removing search controller vulnabilities

app/controllers/public/search_controller.rb
@@ -3,7 +3,10 @@ class SearchController < PublicController @@ -3,7 +3,10 @@ class SearchController < PublicController
3 helper TagsHelper 3 helper TagsHelper
4 include SearchHelper 4 include SearchHelper
5 include ActionView::Helpers::NumberHelper 5 include ActionView::Helpers::NumberHelper
  6 + include SanitizeParams
6 7
  8 +
  9 + before_filter :sanitize_params
7 before_filter :redirect_asset_param, :except => [:assets, :suggestions] 10 before_filter :redirect_asset_param, :except => [:assets, :suggestions]
8 before_filter :load_category, :except => :suggestions 11 before_filter :load_category, :except => :suggestions
9 before_filter :load_search_assets, :except => :suggestions 12 before_filter :load_search_assets, :except => :suggestions
lib/sanitize_params.rb 0 → 100644
@@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
  1 +module SanitizeParams
  2 +
  3 + protected
  4 +
  5 + # Check each request parameter for
  6 + # improper HTML or Script tags
  7 + def sanitize_params
  8 + request.params.each { |k, v|
  9 + if v.is_a?(String)
  10 + params[k] = sanitize_param v
  11 + elsif v.is_a?(Array)
  12 + params[k] = sanitize_array v
  13 + end
  14 + }
  15 + end
  16 +
  17 + # If the parameter was an array,
  18 + # try to sanitize each element in the array
  19 + def sanitize_array(array)
  20 + array.map! { |e|
  21 + if e.is_a?(String)
  22 + sanitize_param e
  23 + end
  24 + }
  25 + return array
  26 + end
  27 +
  28 + # Santitize a single value
  29 + def sanitize_param(value)
  30 + allowed_tags = %w(a acronym b strong i em li ul ol h1 h2 h3 h4 h5 h6 blockquote br cite sub sup ins p)
  31 + ActionController::Base.helpers.sanitize(value, tags: allowed_tags, attributes: %w(href title))
  32 + end
  33 +
  34 +end
test/functional/search_controller_test.rb
@@ -769,6 +769,22 @@ class SearchControllerTest < ActionController::TestCase @@ -769,6 +769,22 @@ class SearchControllerTest < ActionController::TestCase
769 assert_equivalent [t1,t2,c1,c2,c3,c4] , assigns(:searches)[:communities][:results] 769 assert_equivalent [t1,t2,c1,c2,c3,c4] , assigns(:searches)[:communities][:results]
770 end 770 end
771 771
  772 + should 'not allow query injection' do
  773 + injection = '<iMg SrC=x OnErRoR=document.documentElement.innerHTML=1>SearchParam'
  774 + get :tag, :tag => injection
  775 + tag = assigns(:tag)
  776 + assert !tag.upcase.include?('IMG') && tag.include?('SearchParam')
  777 + end
  778 +
  779 + should 'not allow query injection array' do
  780 + injection = ['<iMg SrC=x OnErRoR=document.documentElement.innerHTML=1>', '<script>document.innerHTML = \'x\'</script>']
  781 + get :tag, :tag => injection
  782 + tag = assigns(:tag)
  783 + tag.each { |t|
  784 + assert !t.upcase.include?('IMG') && !t.upcase.include?('SCRIPT')
  785 + }
  786 + end
  787 +
772 protected 788 protected
773 789
774 def create_event(profile, options) 790 def create_event(profile, options)