Лучшие практики при выводе HTML-данных из базы данных в браузер
Я храню данные HTML в базе данных.
Данные html очень просты и генерируются редактором wysiwyg.
Прежде чем я сохраню html-данные в базе данных и запустлю их через HTMLPurifier, чтобы убрать все ошибки.
Когда я вывожу данные обратно в браузер, потому что это html-данные, очевидно, я не могу использовать php htmlspecialchars().
Мне интересно, есть ли какие-либо проблемы с этим в отношении атак XSS. Достаточно ли передавать данные через HTMLPurifier перед сохранением в базе данных? Есть ли какие-то вещи, которые я пропускаю / другие шаги, которые я должен предпринять?
Заранее спасибо за помощь.
3 ответа
То, что вы делаете, правильно. Вы можете также рассмотреть возможность фильтрации по пути, чтобы быть уверенным. Вы упомянули, что используете HTMLPurifier - и это здорово. Только никогда не пытайтесь внедрить дезинфицирующее средство самостоятельно, в этом подходе много подводных камней.
У меня никогда не было проблем с основными редакторами richtext.
XSS происходит, когда люди могут встраивать необработанный html на вашу страницу, используя веб-формы, ввод которых вы выводите позднее (поэтому всегда кодируйте ввод пользователя при записи на экран).
Этого не может случиться с (хорошим) текстовым редактором. Если пользователь вводит HTML-код (например, <или>), текстовый редактор все равно его кодирует. Единственные теги, которые он создаст, являются его собственными.
Существует функция htmlspecialchars, которая будет кодировать символы в их HTML-эквивалент. Например <
становится <
Кроме того, вы можете удалить любые подозрительные теги. Некоторое время назад я написал короткую функцию 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>