Как обрабатывать, возможно, HTML кодированные значения в JavaScript

У меня есть ситуация, когда я не уверен, является ли вводимый мной код HTML или нет. Как мне справиться с этим? У меня также есть JQuery доступны.

function someFunction(userInput){
    $someJqueryElement.text(userInput);
}

// userInput "<script>" returns "&lt;script&gt;", which is fine
// userInput "&lt;script&gt;" returns &amp;lt;script&amp;gt;", which is bad

Я мог избежать побега из амперсандов (&), но каковы риски в этом? Любая помощь очень ценится!

Важное примечание: этот пользовательский ввод не находится под моим контролем. Он возвращается из внешнего сервиса, и кто-то может вмешаться в него и избежать экранирования html, предоставляемого самим сервисом.

2 ответа

Решение

Вы действительно должны убедиться, что избегаете таких ситуаций, поскольку это создает действительно сложные условия для прогнозирования.

Попробуйте добавить дополнительный переменный вход в функцию.

function someFunction(userInput, isEncoded){
    //Add some conditional logic based on isEncoded
    $someJqueryElement.text(userInput);
}

Если вы посмотрите на такие продукты, как fckEditor, вы можете отредактировать исходный текст или использовать редактор форматированного текста. Это предотвращает необходимость автоматического определения кодировки.

Если вы все еще настаиваете на автоматическом обнаружении символов кодировки html, я бы порекомендовал использовать индекс, чтобы убедиться, что существуют определенные ключевые фразы.

str.indexOf('&lt;') !== -1

Этот пример выше обнаружит символ <.

~~~ Новый текст добавлен после редактирования ниже этой строки.~~~

Наконец, я бы предложил посмотреть на этот ответ. Они предлагают использовать функцию декодирования и определения длины.

var string = "Your encoded &amp; decoded string here"

function decode(str){
    return decodeURIComponent(str).replace(/&lt;/g,'<').replace(/&gt;/g,'>');
}

if(string.length == decode(string).length){
    // The string does not contain any encoded html.
}else{
    // The string contains encoded html.
}

Опять же, это все еще имеет проблему с тем, что пользователь подделывает процесс, вводя эти специально закодированные символы, но это то, что представляет собой html-кодирование. Поэтому было бы правильно предположить кодирование html, как только появится одна из этих последовательностей символов.

Вы должны всегда правильно кодировать ненадежный ввод, прежде чем объединять его в структурированный язык, такой как HTML.

В противном случае вы включите инъекционные атаки, такие как XSS.

Если предполагается, что входные данные содержат форматирование HTML, вы должны использовать библиотеку sanitizer для удаления всех потенциально опасных тегов и атрибутов.

Вы также можете использовать регулярное выражение /<|>|&(?![a-z]+;) проверить, есть ли в строке какие-либо некодированные символы; однако вы не можете отличить строку, которая была закодирована, от строки, не закодированной, которая говорит о кодировании.

Другие вопросы по тегам