2010-09-04 13 views
0

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

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

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

ответ

2

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

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

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

+0

Да, например. javascript мы будем вызывать, если они находятся в атрибуте разрешенного тега. +1 для ссылки на htmlpurifier. Я посмотрю. – dierre

0

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

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

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

+0

Нет, нет конкретного запроса о том, какой атрибут сохранить. Фактически я собирался использовать 'htmlentities' также для хранения данных в db. – dierre

+1

@dierre: HTML-кодирование - это только проблема на выходном этапе. Не загрязняйте свою базу данных закодированными данными, это затруднит поиск, использование манипуляции с строкой базы данных и использование в контексте, отличном от HTML. HTML-encode, используя 'htmlspecialchars()', на выходном этапе, где вы помещаете текст в HTML, а не раньше. – bobince

+0

@ dierre: не используйте 'htmlentities' для хранения. Используйте 'mysql_real_escape' или подобное. Кроме того, 'htmlentities' может делить некоторые атрибуты, чтобы поиграть с ним. Однако вы все же хотите избежать атрибутов, поэтому некоторые wiseguy не могут этого сделать: ''. Я бы посмотрел ссылку @bobince, представленную ниже. –