@@ -581,6 +581,25 @@ def test_exclude_node_type_comment
581581    assert_equal ( "<div>text</div><b>text</b>" ,  safe_list_sanitize ( "<div>text</div><!-- comment --><b>text</b>" ) ) 
582582  end 
583583
584+   def  test_disallow_the_dangerous_safelist_combination_of_select_and_style 
585+     input  =  "<select><style><script>alert(1)</script></style></select>" 
586+     tags  =  [ "select" ,  "style" ] 
587+     warning  =  /WARNING: Rails::Html::SafeListSanitizer: removing 'style' from safelist/ 
588+     sanitized  =  nil 
589+     invocation  =  Proc . new  {  sanitized  =  safe_list_sanitize ( input ,  tags : tags )  } 
590+ 
591+     if  html5_mode? 
592+       # if Loofah is using an HTML5 parser, 
593+       #   then "style" should be removed by the parser as an invalid child of "select" 
594+       assert_silent ( &invocation ) 
595+     else 
596+       # if Loofah is using an HTML4 parser, 
597+       #   then SafeListSanitizer should remove "style" from the safelist 
598+       assert_output ( nil ,  warning ,  &invocation ) 
599+     end 
600+     refute_includes ( sanitized ,  "style" ) 
601+   end 
602+ 
584603protected 
585604
586605  def  xpath_sanitize ( input ,  options  =  { } ) 
@@ -641,4 +660,8 @@ def convert_to_css_hex(string, escape_parens=false)
641660  def  libxml_2_9_14_recovery? 
642661    Nokogiri . method ( :uses_libxml? ) . arity  == -1  && Nokogiri . uses_libxml? ( ">= 2.9.14" ) 
643662  end 
663+ 
664+   def  html5_mode? 
665+     ::Loofah . respond_to? ( :html5_mode? )  && ::Loofah . html5_mode? 
666+   end 
644667end 
0 commit comments