Возможно, у вас есть несколько вариантов ... самый простой способ - это преобразовать кавычки и, возможно, символы <>, в их HTML-кодированные эквиваленты ("и т. Д.), Что приведет к буквальному отображению HTML-кода.
Скажите мне, какой серверный язык вы используете, и я могу указать вам более подробную информацию о языке, если хотите. (Например, PHP имеет htmlspecialchars () [1]).
РЕДАКТИРОВАТЬ: Я просто прочитал ваш вопрос. Хорошо, вы хотите разрешить HTML через, но без JavaScript? Ну, из-за отсутствия простого решения, которое приходит мне в голову, я предлагаю просто использовать замену строк (возможно, с помощью регулярных выражений?), Чтобы полностью избавиться от них.
В JavaScript существует конечный набор атрибутов обработчика событий. Соедините это с потребностью в кавычках, и вы, вероятно, хорошо.
Для подтверждения концепции, в Perl вы, вероятно, сделаете что-то вроде этого:
$myInput =~ s/on(mouseover|mouseout|click|focus|blur|[...])(\"[^\"]*\")|(\'[^\']*\')\s*//gi;
Итак, захватите имя обработчика событий (только некоторые из которых я включил), затем выражение в кавычках, использующее одинарные или двойные кавычки, имеют необязательный пробел в конце и замените всю вещь ничем (т.е. удалите его) .
Это не сработает для чего-то, требующего большего количества уровней цитирования, поскольку в конечном итоге вы вернетесь к исходным разделителям. Простите за надуманный и совершенно бесполезный пример:
onclick="eval('3+prompt("Enter a number: ")')"
В этом случае вам может понадобиться написать цикл, который сначала анализирует строку по слову (т. Е. Ищет имя обработчика события), затем идет символ за символом, отслеживая количество уровней цитирования по мере продвижения и отслеживание текущего разделителя:
- Отметить индекс начала имени обработчика («o» в onclick и т. Д.)
- Начните с уровня цитирования 0 (или 1 после обработки начального ограничителя цитаты).
- Если текущим разделителем является «и вы видите», то увеличьте уровень цитирования на 1 и переключите текущий разделитель на «.
- Если текущим разделителем является «и вы видите», уменьшите уровень цитирования на 1 и переключите текущий разделитель на «.
- Если текущим разделителем является «и вы видите», то увеличьте уровень цитирования на 1 и переключите текущий разделитель на «.
- Если текущим разделителем является «и вы видите», уменьшите уровень цитирования на 1 и переключите текущий разделитель на «.
- Если уровень цитирования возвращается к 0, то ваша строка заканчивается. Отметьте индекс окончания строки.
- Используйте функцию манипуляции со строками, чтобы вырезать подстроку из первого индекса в последний индекс.
Это немного больше времени, но теоретически должно работать независимо от того, что, если HTML хорошо сформирован. (Это ужасное предположение, но если оно не правильно сформировано, вы все равно можете просто отклонить ввод!)
[1] http://us3.php.net/manual/en/function.htmlspecialchars.php