PHP предлагает методы синтаксического анализа для защиты от кода PHP/SQL-инъекций (например, mysql_real_escape_string()
). Это не относится к HTML/CSS/JavaScript. Почему так?
Во-первых: единственной целью HTML/CSS/Javascript является отображение информации. В значительной степени вам решать, принимать определенные элементы HTML или отклонять их в зависимости от ваших требований.
Во-вторых: из-за очень большого количества элементов HTML/CSS/JS (которое также постоянно увеличивается) невозможно пытаться контролировать HTML. вы не можете ожидать функционального решения.
Вот почему я бы предложил решение сверху вниз. Я предлагаю начать ограничивать все, а затем разрешать только определенное количество тегов. Хорошей основой, вероятно, является использование BBCdode, довольно популярный. Если вы хотите «разблокировать» дополнительные определенные теги помимо BBCode, вы всегда можете добавить их.
По этой причине скрипты, подобные BBCode, популярны на форумах и веб-сайтах (включая переполнение стека). Редакторы WISIGIG предназначены для административного/внутреннего использования, потому что вы не ожидаете, что администратор вашего веб-сайта будет добавлять плохой контент.
подходы снизу-вверх обречены на провал. Дезинфицирующие средства HTML подвержены экспоненциальной сложности и ничего не гарантируют.
ИЗМЕНИТЬ 1
Вы говорите, что это проблема санитарии, а не проблемы с интерфейсом. Я не согласен, потому что, поскольку вы не можете обрабатывать все существующие и будущие объекты HTML, вам лучше ограничить его на уровне внешнего интерфейса, чтобы быть уверенным на 100%.
При этом, возможно, ниже приведено рабочее решение для вас:
- вы можете немного очистить свой код, разделив все объекты, кроме тех, которые находятся в белом списке, используя PHP
strip_tags()
.
- Вы также можете удалить все оставшиеся атрибуты тегов (свойства), используя PHP
preg_replace()
с некоторым регулярным выражением.
$string = "put some very dirty HTML here.";
$string = strip_tags($string, '<p><a><span><h1><li><ul><br>');
$string = preg_replace("/<([b-z][b-z0-9]*)[^>]*?(\/?)>/i",'<$1$2>', $string);
echo $string;
Это вернет ваш обработанный текст.
Примечание: я исключил удаление атрибутов для тегов, поскольку вы можете по-прежнему захотеть сохранить свойства href="". отсюда и регулярное выражение [b-z][B-Z]
.
person
Yann
schedule
25.09.2014
data-
, но поскольку они явно предназначены для локального расширения сайта в HTML в любом случае, это не имеет значения, вы просто добавляете определенные атрибуты данных, которые вам нужны. В HTML 5<br />
и<br>
эквивалентны, поэтому переход между ними не имеет значения. Разрешение<article>
должно быть тривиальным, но я не могу представить момент, когда вы будете запрашивать пользовательский ввод, состоящий из нескольких статей одновременно. - person Quentin   schedule 04.05.2014