2011-05-02 13 views
5

¿Es posible pasar HTML a un navegador a través de JavaScript y analizarlo con jQuery, pero no cargar recursos externos? (secuencias de comandos, imágenes, flash, cualquier cosa)Análisis del navegador HTML para jQuery sin recursos de carga

Lo haré con el analizador XML si eso es lo mejor que puedo hacer, pero me gustaría permitir HTML suelto si es posible.

Debe ser compatible con Chrome, Firefox, el último IE.

+0

He resuelto el problema ... puede adaptar esto para reemplazar el src por cualquier etiqueta http://stackoverflow.com/questions/6671461/replace-img-elements-src-attribute-in-regex – samccone

+0

Como no lo hago controle el HTML fuente, y hay demasiados trucos difíciles, no puedo aceptar una respuesta de expresiones regulares. Lo siento. Además, tiene sentido que las secuencias de comandos no se ejecuten, ya que pueden decidir cargar recursos externos por su cuenta. –

Respuesta

1
var html = someHTML; //passed in html, maybe $('textarea#id').val();? I don't understand what you mean by 'passed in html' 
var container = document.createElement('div'); 
container.innerHTML = html; 
$(container).find('img,embed,head,script,style').remove(); 
//or 
$(container).find('[src]').remove(); 

var target = someTarget; //place to put parsed html 
$(container).appendTo($(target)); 

EDITAR

funcionamiento probado

removeExt = function(cleanMe) { 
    var toScrutinize = $(cleanMe).find('*'); //get ALL elements 
    $.each(toScrutinize, function() { 
     var attr = $(this)[0].attributes; //get all the attributes 
     var that = $(this); 
     $.each(attr, function(){ 
      if ($(that).attr(this.nodeName).match(/^http/)) {//if the attribute value links externally 
      $(that).remove(); //...take it out 
      } 
     }) 
    }) 
    $('script').remove(); //also take out any inline scripts 
} 

var html = someHTML; 
var container = document.createElement('div'); 
container.innerHTML = html; 
removeExt($(container)); 
var target = someTarget; 
$(container).appendTo($(target)); 

Esto coincidirá src, href, enlace, los datos-foo, lo que sea ... No hay manera de ligar el exterior. http y https son ambos coincidentes. los scripts en línea son asesinados. Si todavía es una preocupación de seguridad, entonces quizás esto deba hacerse en el lado del servidor u ofusque su JS.

+0

Solución interesante, pero no particularmente buena para la seguridad. Lo siento, parece que la respuesta es "no se puede hacer sin una lista negra". –

+0

Por externo, ¿te refieres siempre alojado en un dominio que no sea el dominio del del script? ¿O te refieres a cualquier elemento que no se pueda representar en un solo archivo HTML? –

+0

No quiero que se realice ninguna actividad de red cuando se produce el análisis sintáctico, y no quiero que se ejecute ninguna secuencia de comandos. –

Cuestiones relacionadas