Очистить все до текста с помощью htmlpurifier

Я новичок в защите xss, и это заставило меня задуматься, безопасно ли это.

Если я использую, например:

$lol = "javascript:alert('asd')";

$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$config->set('HTML.Allowed', '');
$cleaned = $purifier->purify($lol);


<a href="<?php echo $cleaned; ?>"><?php echo $cleaned; ?></a>

Приведенный выше код по-прежнему будет выводить функцию предупреждения, например, если я нажму ссылку, появится всплывающее окно.

Это безопасно, учитывая XSS?

Также я использую $config->set('HTML.Allowed', '');, так как я хочу выводить ТОЛЬКО текст, а не HTML вообще.

Должен ли я затем добавить регулярное выражение для проверки ;:, например, [^:;], на всякий случай.

Стоит отметить, что все данные, которые пользователи отправляют на мой сайт, будут выводиться только между тегами <p> и тегами <h1>.

Заранее спасибо,

// Новичок в XSS.


person user2722667    schedule 12.01.2014    source источник
comment
Примечание: причина, по которой очиститель HTML не распознает, заключается в том, что это не HTML, а данные в атрибуте HTML. Если бы вы поместили <a href="javascript:alert('asd')">javascript:alert('asd')</a> в HTML Purifier, он бы делал то, что вы хотите, потому что в этот момент он знает, что должен рассматривать javascript:alert('asd') как ссылку. Но, как сказал Пез, это, вероятно, излишество для того, чего вы хотите достичь. :)   -  person pinkgothic    schedule 13.01.2014


Ответы (1)


Не усложняйте вашу дезинфекцию, просто сделайте $cleaned = htmlentities($lol);, это преобразует все возможные теги html в соответствующие им объекты html в виде строки.

Вы говорите my site will only be outputted between <p> tags and <h1> tags, так что в этом случае htmlentities будет просматривать, поскольку пользователь не сможет использовать html, поэтому они не могут создать ссылку.

Однако в этом тестовом примере, поскольку вы переключаете строку $cleaned в href даже после удаления тегов html (например, в $lol НЕТ тегов html), все еще выводится действительный javascript.

XSS обычно полагается на теги сценария, например. <script>alert('asd');</script> в данном случае их нет.

Если вы все еще хотите иметь возможность выводить эхо в ahref, могу ли я предложить убрать слово javascript: спереди? Или, возможно, преобразование всех не буквенно-цифровых символов в объекты HTML.

person Pez Cuckow    schedule 12.01.2014
comment
Спасибо, но поскольку я выводю данные только внутри жестко запрограммированных тегов ‹p› и ‹h1›, могу ли я просто использовать strip_tags при вставке данных в базу данных, а затем использовать htmlspecialchars ($ the_data); когда я его выводлю? Я просто хочу убедиться, что никакой xss не может передать его, - и я использую bind_param для защиты от sql-inject - person user2722667; 12.01.2014
comment
@ user2722667 htmlspecialchars(strip_tags($input)) должен делать то, что вы хотите, и безопасно, ага. :) (Не забывайте, однако, о двух других параметрах htmlspecialchars(); кодировка особенно важна.) - person pinkgothic; 13.01.2014