Лучшие практики при выводе HTML-данных из базы данных в браузер - PullRequest
2 голосов
/ 23 февраля 2011

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

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

0 голосов
/ 23 февраля 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>
0 голосов
/ 23 февраля 2011

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

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

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

...