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

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

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

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

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

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

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


person Travis Brunn    schedule 23.02.2011    source источник


Ответы (3)


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

person Sripathi Krishnan    schedule 26.02.2011

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

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

Этого не может произойти с (хорошим) текстовым редактором. Если пользователь вводит html-код (например, ‹ или ›), текстовый редактор все равно закодирует его. Единственные теги, которые он будет создавать, будут его собственными.

person jenson-button-event    schedule 23.02.2011
comment
Не правда. Обычно будет вызов AJAX или отправка формы для отправки html на сервер. Злоумышленник может легко изменить html, чтобы он содержал произвольный код javascript. Если вы не фильтруете это на стороне сервера, у вас есть сохраненная проблема XSS. - person Sripathi Krishnan; 26.02.2011

Существует функция 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>
person Michael Jasper    schedule 23.02.2011
comment
HTMLSpecialChars в этом случае не работает, потому что OP хочет, чтобы html отображался, а не отображался как текст. Кроме того, не рекомендуется писать HTML-фильтр/очиститель, особенно тот, который предназначен только для клиента и основан на черном списке; Есть несколько способов обойти такой фильтр. Попробуйте эту памятку — ha.ckers.org/xss.html - person Sripathi Krishnan; 26.02.2011