Что делать с escape-символами ASCII в пользовательской разметке?

Я использую HTML Purifier, PHP-фильтр, защищающий от XSS и обеспечивающий вывод в соответствии со стандартами, для очистки / стандартизировать разметку, введенную пользователем.

Это пример разметки, введенной пользователем:

<font face="'Times New Roman', Times">TEST</font>

который генерирует:

<span style="font-family:&quot;Times New Roman&quot;, Times;">TEST</span>

Я немного запутался, потому что &quot даже не является escape-символом для одинарной кавычки. Какова наилучшая практика здесь, так как я собираюсь использовать этот пользовательский контент позже?


person Kyle    schedule 05.09.2010    source источник


Ответы (2)


Мне кажется, все в порядке.

Я думаю, что преобразование одинарной кавычки в двойную происходит из-за того, что очиститель HTML разбирает весь тег и собирает его обратно в соответствии со своими собственными правилами, которые используют двойные кавычки при цитировании внутри атрибута style.

Он также отлично подходит для меня. Какой тип документа вы проверяете?

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

person Pekka    schedule 05.09.2010
comment
Отлично - если это выглядит хорошо для вас, то я буду использовать его! Спасибо! Кроме того, я удалил комментарий проверки из своего сообщения... он отлично проверяется в XHTML 1.0 Strict, который мне нужен. - person Kyle; 05.09.2010

Выходные данные допустимы для XHTML, но преобразование сущности неверно. <img src="/test" alt="I'm ok"/> будет преобразовано в <img src="/test" alt="I&quot;m ok">

Достаточно простого:

$allowed_tags='<font>';
echo htmlspecialchars(strip_tags(rawurldecode($input),$allowed_tags),ENT_COMPAT,'UTF-8');

но он не преобразует тег ‹font› в ‹span›.

person bcosca    schedule 05.09.2010
comment
Преобразование объекта не является неправильным как таковым: HTML Purifier деконструирует все это целиком и склеивает его вместе с новым синтаксисом. Этот синтаксис использует &quot; вместо одинарных кавычек. Я действительно не вижу в этом ничего плохого. - person Pekka; 05.09.2010
comment
то, что вы сказали, будет иметь смысл. Но я только что попробовал и получил <img src="hello.img" alt="I'm here" />, что означает, что HTML Purifier должен быть чувствителен к атрибутам. Но +1 за вариант использования ... Я не думал об этом, и это определенно стоило протестировать. Это решение должно подойти тем, кто получает alt="I&quot; ok" - person Kyle; 05.09.2010
comment
@Pekka Я думаю, что Stillstanding говорил, что &quot; было бы неуместно в его примере, поскольку в теге alt была бы желательна одиночная кавычка. - person Kyle; 05.09.2010