2015-03-08 3 views
0

Прежде всего, у меня есть возврат от API в виде html. Это будет использоваться в моем jqgrid. Образец возврата будет выглядеть следующим образом: Имя примера для моего объекта: obj. Затем находится obj.something.Javascript - sanitize specific html element

<div title="custom_title"> 
    <div id="upper"> 
     data from somewhere and this is the part that sometimes need to be sanitized without affecting the other tags 
    </div> 

</div> 

Что я пытался до сих пор пытался это сделать: вар = $ ESC (''); после этого сделал это: esc.text(obj.something).html();, но он дезинфицирует все это. Есть ли что-нибудь, что я, возможно, не знаю о том, как санировать исключительно на javascript?

Любая помощь очень ценится.

+1

Является ли API вашим и что-то, что вы можете изменить? Возвращение неактифицированного вывода, заключенного в HTML, действительно является чем-то, чего вам следует избегать. – JJJ

+0

Я забыл упомянуть, что я делал дезинфекцию в апи. Фактически он использует эти данные из api, а затем передает их в другую сетку. – elL

+1

. Тогда почему вам нужно снова дезинфицировать на стороне клиента, если он уже подвергся санитарной обработке API? – JJJ

ответ

-1

соглашаясь здесь с @Juhana: «Возвращение unsanitized выхода завернутого в HTML действительно что-то вам следует избегать.» Тем не менее, если нет, и вы хотите контролировать и дезинфицировать DOM вы могли бы сделать это в равнинных JS:

obj = {}; 
 
obj.something = '<div title="custom_title"><div id="upper">data from somewhere and this is the part that sometimes need to be sanitized without affecting the other tags</div></div>'; 
 
      
 
var container = document.createElement("div"); //create an element in memory 
 
container.insertAdjacentHTML('afterbegin', obj.something); //serialize the HTML string into the structure. 
 

 
    container.querySelector("#upper").innerHTML = ""; //empty the element, removing the data in it. (or do something else with it, like stripping all the a elements that do not start with http(s). 
 

 
console.log(container)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Это делает HTML OBJ в в элемент памяти, чем вы можете выполнять манипуляции с DOM на нем и удалить содержимое DIV с идентификатором upper. По завершении вставьте содержимое контейнера div в свою сетку.

+0

Я не являюсь нисходящим, но заметьте, что это удаляет контент, а не дезинфицирует его. –

+0

@RickHitchcock, строго это то, что делает OP в своем примере, только для всей строки HTML. Однако последнее может быть исключено из решения, ответ на самом деле заключается в сериализации HTML-кода в элемент и использовании DOM-манипуляций для вашей санировки. – Mouser

+0

Истинно, что OP удаляет все содержимое. Однако обратите внимание на слово «иногда»: «данные откуда-то, и это часть, которая * иногда * нуждается в дезинфекции, не затрагивая другие теги». Если в этой строке нет меток или XSS-инъекций, санировать нечем. В любом случае ОП может реагировать на это по мере необходимости. –

1

В этой ситуации вы можете использовать DOMPurify

DOMPurify дезинфицирует HTML и предотвращает XSS атак. Вы можете кормить DOMPurify строкой, заполненной грязным HTML, и она вернет строку с чистым HTML. DOMPurify вычеркнет все, что содержит опасный HTML, и тем самым предотвратит атаки XSS и другую гадость.