10

He intentado utilizar la gema Sanitize para limpiar una cadena que contiene el código HTML de un sitio web.Eliminar todo el JavaScript de una página HTML

Solo eliminó las etiquetas <script>, no el JavaScript dentro de las etiquetas de secuencia de comandos.

¿Qué puedo usar para eliminar JavaScript de una página?

+2

¿Desea eliminar también todos los atributos 'on *'? – Phrogz

Respuesta

5

Soy parcial de la joya Loofah. Modificado de un ejemplo en los documentos:

1.9.3p0 :005 > Loofah.fragment("<span onclick='foo'>hello</span> <script>alert('OHAI')</script>").scrub!(:prune).to_s 
=> "<span>hello</span> " 

Usted puede estar interesado en la ActiveRecord extensions lufa ofrece.

13
require 'open-uri'  # included with Ruby; only needed to load HTML from a URL 
require 'nokogiri'  # gem install nokogiri read more at http://nokogiri.org 

html = open('http://stackoverflow.com')    # Get the HTML source string 
doc = Nokogiri.HTML(html)       # Parse the document 

doc.css('script').remove        # Remove <script>…</script> 
puts doc            # Source w/o script blocks 

doc.xpath("//@*[starts-with(name(),'on')]").remove # Remove on____ attributes 
puts doc            # Source w/o any JavaScript 
+0

Esto parece una muy mala idea si su intención es evitar ataques XSS. Hay todo tipo de casos extremos que te estás perdiendo. https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet – Ajedi32

6

Resulta que Sanitize tiene una opción integrada en (no documentado) ...

Sanitize.clean(content, :remove_contents => ['script', 'style']) 

Este eliminado todas las etiquetas de secuencia de comandos y el estilo (y su contenido) como quería.

0

Así que hay que añadir la gema sanitize a su Gemfile:

gem 'sanitize` 

Entonces bundle

Y entonces usted puede hacer Sanitize.clean(text, remove_contents: ['script', 'style'])

0

utilizo esta expresión regular para deshacerse de <script> y </script> etiquetas en contenido embebido y simplemente hacer desaparecer las etiquetas. También elimina cosas como < script> o </script> ... etc ... es decir, espacio en blanco añadido.

post.content = post.content.gsub(/<\s*script\s*>|<\s*\/\s*script\s*>/, '')

Cuestiones relacionadas