Я предложу вам .parseHTML()
с bemol , как указано в документации.
.parseHTML()
, как следует из названия метода, анализируетстрока для интерпретации HTML.
Третий аргумент keepScripts
по умолчанию равен false ... Если установить значение true, откроются широкие ворота для сценариев.
Так что "обычно удаляет" теги сценария.Если HTML или текст вообще не найден, возвращается undefined
(как в демонстрационном случае № 3).Таким образом, вам, вероятно, потребуется добавить условие if
, чтобы избежать добавления текста "undefined" .
Итак ... В приведенной ниже демонстрации я использовал сценарий "опубликовал", чтобы добавить"вполне как есть ... Я только что добавил метод разбора HTML.
ВАЖНО , случаи с 1 по 4 безопасны ... Но # 5 - это нарушение.Если в проанализированном HTML есть встроенный атрибут [event], он будет проходить через «скрипт-фильтр» и может выполняться.
$(".console_ok").on("click",function(){
toConsole( $(this).prev(".console_input").val() );
});
function toConsole(str) {
str = $.parseHTML(str)[0];
var myconsole = document.getElementById("console-text");
var message = document.createElement("span");
message.append(str);
myconsole.append(message);
}
input{
width: 60em;
}
#console-text{
height:8em;
width:20em;
background-color: #bbb;
border: 1px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
console.log test #1:<input class="console_input" value="Just text">
<button class="console_ok">OK</button><br>
<br>
console.log test #2:<input class="console_input" value="<h1>Some HTML</h1>">
<button class="console_ok">OK</button><br>
<br>
console.log test #3:<input class="console_input" value="<script>alert('A script!!!');</script>">
<button class="console_ok">OK</button><br>
<br>
console.log test #4:<input class="console_input" value="<div style='height:20px;background-color:red;'><script>alert('A script!!!');</script>And some <b>bold</b> text...</div>">
<button class="console_ok">OK</button><br>
<br>
console.log test #5:<input class="console_input" value="<img src='invalid-path' onerror='alert(`JS EXECUTES HERE!!!`);'>">
<button class="console_ok">OK</button><br>
<br>
My console:<br>
<div id="console-text"></div>
(Пожалуйста, запустите в режиме полной страницы)
CodePen
Вы заметите [0]
после $.parseHTML(str)
... Это для получения элемента DOM из объекта jQuery, так как ваша функция - простой JS.Ваша функция может быть написана так же (делает то же самое) :
function toConsole(str) {
str = $.parseHTML(str);
var myconsole = $("#console-text");
var message = $("<span>");
message.append(str);
myconsole.append(message);
}