Commit 7441ba6c92304870c6110814fd588718d6e7bde3

Authored by Antonio Terceiro
1 parent 4c229767

Always sanitize HTML in header and footer

app/models/profile.rb
@@ -392,7 +392,7 @@ class Profile < ActiveRecord::Base @@ -392,7 +392,7 @@ class Profile < ActiveRecord::Base
392 end 392 end
393 393
394 xss_terminate :only => [ :name, :nickname, :address, :contact_phone, :description ], :on => 'validation' 394 xss_terminate :only => [ :name, :nickname, :address, :contact_phone, :description ], :on => 'validation'
395 - xss_terminate :only => [ :custom_footer, :custom_header ], :with => 'white_list', :on => 'validation' 395 + xss_terminate :only => [ :custom_footer, :custom_header ], :with => 'white_list'
396 396
397 include WhiteListFilter 397 include WhiteListFilter
398 filter_iframes :custom_header, :custom_footer 398 filter_iframes :custom_header, :custom_footer
test/unit/profile_test.rb
@@ -840,6 +840,14 @@ class ProfileTest < ActiveSupport::TestCase @@ -840,6 +840,14 @@ class ProfileTest < ActiveSupport::TestCase
840 assert_equal 'environment footer', profile.custom_footer 840 assert_equal 'environment footer', profile.custom_footer
841 end 841 end
842 842
  843 + should 'sanitize custom header and footer' do
  844 + p = fast_create(Profile)
  845 + script_kiddie_code = '<script>alert("look mom, I am a hacker!")</script>'
  846 + p.update_header_and_footer(script_kiddie_code, script_kiddie_code)
  847 + assert_no_tag_in_string p.custom_header, tag: 'script'
  848 + assert_no_tag_in_string p.custom_footer, tag: 'script'
  849 + end
  850 +
843 should 'store theme' do 851 should 'store theme' do
844 p = build(Profile, :theme => 'my-shiny-theme') 852 p = build(Profile, :theme => 'my-shiny-theme')
845 assert_equal 'my-shiny-theme', p.theme 853 assert_equal 'my-shiny-theme', p.theme
@@ -1555,8 +1563,6 @@ class ProfileTest &lt; ActiveSupport::TestCase @@ -1555,8 +1563,6 @@ class ProfileTest &lt; ActiveSupport::TestCase
1555 profile.address = "<h1><</h2< Malformed >> html >< tag" 1563 profile.address = "<h1><</h2< Malformed >> html >< tag"
1556 profile.contact_phone = "<h1<< Malformed ><>>> html >< tag" 1564 profile.contact_phone = "<h1<< Malformed ><>>> html >< tag"
1557 profile.description = "<h1<a> Malformed >> html ></a>< tag" 1565 profile.description = "<h1<a> Malformed >> html ></a>< tag"
1558 - profile.custom_header = "<h1<a>><<> Malformed >> html ></a>< tag"  
1559 - profile.custom_footer = "<h1> Malformed <><< html ></a>< tag"  
1560 profile.valid? 1566 profile.valid?
1561 1567
1562 assert_no_match /[<>]/, profile.name 1568 assert_no_match /[<>]/, profile.name
@@ -1568,6 +1574,16 @@ class ProfileTest &lt; ActiveSupport::TestCase @@ -1568,6 +1574,16 @@ class ProfileTest &lt; ActiveSupport::TestCase
1568 assert_no_match /[<>]/, profile.custom_footer 1574 assert_no_match /[<>]/, profile.custom_footer
1569 end 1575 end
1570 1576
  1577 + should 'escape malformed html tags in header and footer' do
  1578 + profile = fast_create(Profile)
  1579 + profile.custom_header = "<h1<a>><<> Malformed >> html ></a>< tag"
  1580 + profile.custom_footer = "<h1> Malformed <><< html ></a>< tag"
  1581 + profile.save
  1582 +
  1583 + assert_no_match /[<>]/, profile.custom_header
  1584 + assert_no_match /[<>]/, profile.custom_footer
  1585 + end
  1586 +
1571 should 'not sanitize html comments' do 1587 should 'not sanitize html comments' do
1572 profile = Profile.new 1588 profile = Profile.new
1573 profile.custom_header = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>' 1589 profile.custom_header = '<p><!-- <asdf> << aasdfa >>> --> <h1> Wellformed html code </h1>'