javascript заменяет разрешенные html-теги

#javascript #jquery

#javascript #jquery

Вопрос:

Мне нужно использовать javascript для удаления всех html-тегов, за исключением тех, которые я явно разрешаю. У меня есть форма, которая допускает только следующие теги и соответствующие им конечные теги:

 <b> <strong> <i> <em> <u> <br> <pre>
<blockquote> <ol> <ul> <li> 
<a href="http://www.somesite.com">link</a>
  

Вся остальная разметка должна быть удалена. Я искал, но нашел только случаи, когда все теги удалены или удален один тег. Можно ли это сделать просто? Я не могу использовать PHP, должен быть javascript. Какие-либо решения?

Спасибо!

Комментарии:

1. Нет. Вы должны использовать PHP, иначе ваши меры безопасности бесполезны.

2. Если это что-то для интрасети, я не думаю, что безопасность является проблемой. Просто функциональность. Но да, нет перехода на javascript…

3. В качестве упражнения на JavaScript да, я уверен, что вы могли бы написать несколько регулярных выражений для поиска тегов и удаления их, если их нет в вашем списке разрешенных тегов, но, как было указано, для реального приложения вы должны делать это на стороне сервера. Я бы серьезно рассмотрел возможность предотвращения / удаления всех HTML-тегов в угловых скобках и вместо этого разрешил теги в стиле BBCode / forum в квадратных скобках, где только определенные вами теги преобразуются в реальные HTML-теги для последующего отображения.

4. вам лучше использовать какую-нибудь серверную часть, либо PHP / ASP, либо что-то еще

Ответ №1:

 jQuery.fn.removeTags = function()
{
    this.each(function()
    {
        if(jQuery(this).children().length == 0)
        {
            jQuery(this).replaceWith(jQuery(this).text());
        }
        else
        {
            jQuery(this).children().unwrap();
        }
    });
    return this;
};

jQuery("#container").find(":not(b, strong, i, em, u, br, pre, blockquote, ul, ol, li, a)").removeTags();
  

Убедитесь, что контейнер не находится выше body тега. Или у вас могут возникнуть проблемы, когда он удаляет теги head , html script и т.д.

Также, если вы хотите, чтобы :not мог быть списком, и вы могли бы:

 var mylist = ["b" ,"strong", ... etc. etc.];
jQuery(":not("   mylist.join(", ")   ")").removeTags();
  

Или даже поместите это в функцию removeTags. (возможности безграничны … )

РЕДАКТИРОВАТЬ: как некоторые отметили в комментариях: Javascript может быть отключен. Другое дело, я предположил, что вы хотели сохранить всю внутреннюю информацию. Если нет, то достаточно просто удалить(), как предлагает megakorre.

Комментарии:

1. Хотя это работает, я решил использовать стиль BB-кода и преобразовать их.

Ответ №2:

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

вы можете поместить содержимое в div и вызвать

 $('#container :not(b, strong, em, u, br, pre, blockquote, ol, ul, li, a)').remove();
var res = $("#container").html();
  

Ответ №3:

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