Очистка HTML-строки с сохранением некоторых тегов и атрибутов - PullRequest
0 голосов
/ 05 сентября 2010

После того, как я реализовал свои функции очистки (в соответствии с запрошенными подробностями), мой босс решил изменить принятый ввод.Теперь он хочет сохранить какой-то определенный тег и его атрибуты.Я предложил реализовать BBCode-подобный язык, который безопаснее imho, но он не хочет этого, потому что это потребует много работы.

На этот раз я хотел бы сохранить его простым, чтобы я не убил его.в следующий раз он просит меня снова изменить эту вещь.И я знаю, что он это сделает.

Достаточно ли сначала использовать strip_tags с параметром tag для сохранения, а затем htmlentities?

Ответы [ 2 ]

2 голосов
/ 05 сентября 2010

strip_tags не обязательно приводит к безопасному содержанию. strip_tags с последующим htmlentities будет безопасным, поскольку все, что закодировано в HTML, безопасно, но в этом нет никакого смысла.

Либо пользователь вводит простой текст, в этом случае его следует выводить с помощью htmlspecialchars (предпочтительнее htmlentities), либо он вводит разметку HTML, и в этом случае вам необходимо правильно его проанализировать, исправив сломанная разметка и удаление элементов / атрибутов, которые не находятся в безопасном белом списке.

Если это то, что вам нужно, используйте для этого существующую библиотеку (например, htmlpurifier ). Потому что это не тривиальная задача, и если вы ошибетесь, вы сами дадите дыры в безопасности XSS.

0 голосов
/ 05 сентября 2010

Вы можете сохранить определенные теги, используя strip_tags с этим синтаксисом: strip_tags($text, '<p><a>');

В этом фрагменте будут удалены все теги, кроме p и a. Атрибуты сохраняются для разрешенных вами тегов (p и a в приведенном выше примере).

Однако это не означает, что атрибуты безопасны. Ему нужны определенные атрибуты или он хочет сохранить все их в разрешенных тегах? В первом случае вам нужно будет проанализировать каждый тег и удалить нужные, очистив значения. Чтобы сохранить все атрибуты в разрешенных тегах, вам все равно нужно их очистить Я бы порекомендовал запустить htmlentities для значений атрибутов для их дезинфекции (для отображения, я бы предположил).

...