Лучшие практики при выводе HTML-данных из базы данных в браузер

Я храню данные HTML в базе данных.

Данные html очень просты и генерируются редактором wysiwyg.

Прежде чем я сохраню html-данные в базе данных и запустлю их через HTMLPurifier, чтобы убрать все ошибки.

Когда я вывожу данные обратно в браузер, потому что это html-данные, очевидно, я не могу использовать php htmlspecialchars().

Мне интересно, есть ли какие-либо проблемы с этим в отношении атак XSS. Достаточно ли передавать данные через HTMLPurifier перед сохранением в базе данных? Есть ли какие-то вещи, которые я пропускаю / другие шаги, которые я должен предпринять?

Заранее спасибо за помощь.

3 ответа

То, что вы делаете, правильно. Вы можете также рассмотреть возможность фильтрации по пути, чтобы быть уверенным. Вы упомянули, что используете HTMLPurifier - и это здорово. Только никогда не пытайтесь внедрить дезинфицирующее средство самостоятельно, в этом подходе много подводных камней.

У меня никогда не было проблем с основными редакторами richtext.

XSS происходит, когда люди могут встраивать необработанный html на вашу страницу, используя веб-формы, ввод которых вы выводите позднее (поэтому всегда кодируйте ввод пользователя при записи на экран).

Этого не может случиться с (хорошим) текстовым редактором. Если пользователь вводит HTML-код (например, <или>), текстовый редактор все равно его кодирует. Единственные теги, которые он создаст, являются его собственными.

Существует функция htmlspecialchars, которая будет кодировать символы в их HTML-эквивалент. Например < становится &lt;

Кроме того, вы можете удалить любые подозрительные теги. Некоторое время назад я написал короткую функцию js, чтобы сделать это для проекта (отнюдь не всеобъемлющего!). Вы можете взять это и отредактировать для своих нужд или основывать на этом свое собственное...

    <script language="javascript" type="text/javascript">

    function Button1_onclick() {
        //get text
        var text = document.getElementById("txtIn").value;
        //wype it
        text = wype(text);
        //give it back
        document.getElementById("txtOut").value = text;
    }

    function wype(text) {
        text = script(text);
        text = regex(text);
        return text
    }


    function script(text) {
        var re1 = new RegExp('<script.*?>.*?</scri'+'pt>', 'g');
        text = text.replace(re1, '');
        return text
    }

    function regex(text) {
        var tags = ["html", "body", "head", "!doctype", "script", "embed", "object", "frameset", "frame", "iframe", "meta", "link", "div", "title", "w", "m", "o", "xml"];
        for (var x = 0; x < tags.length; x++) {
            var tag = tags[x];
            var re = new RegExp('<' + tag + '[^><]*>|<.' + tag + '[^><]*>', 'g');
            text = text.replace(re, '');
        }
        return text;
    }
</script>
Другие вопросы по тегам