В моем веб-приложении пользователи могут вводить текстовые данные.Эти данные могут быть показаны другим пользователям, а первоначальный автор также может вернуться и отредактировать свои данные.Я ищу правильный способ безопасного экранирования этих данных.
Я только санирую sql при входе, поэтому все хранится в процессе чтения.Допустим, у меня есть «дежа вю» в базе данных.Или, чтобы быть более экстремальным, тег <script>
.Вполне возможно, что это может быть действительным, и даже не злонамеренным, вводом.
Я использую htmlentities()
на выходе, чтобы убедиться, что все экранировано.Проблема в том, что html и поля ввода обрабатывают вещи по-разному.Я хочу убедиться, что это безопасно в HTML, но автор, когда редактирует текст, видит именно то, что они напечатали в полях ввода.Я также использую jQuery для динамического заполнения полей формы данными.
Если я сделаю это:
<p><?=htmlentities("déjà vu");?></p>
<input type=text value="<?=htmlentities("déjà vu");?>">
Исходный код страницы помещает déjà vu
в обоих местах (мне пришлось сделать обратную галочкуэто или вы бы увидели «déjà vu»!) Проблема в том, что вывод в <p>
правильный, но ввод просто показывает экранированный текст.Если пользователь повторно отправляет свою форму, он дважды убегает и разрушает свой ввод.
Я знаю, что мне все еще нужно очистить текст, который входит в поле, в противном случае вы можете закончить кавычку и делать плохие вещи.Единственное решение, которое я нашел, это.Опять же, я использую jQuery.
var temp = $("<div></div>").html("<?=htmlentities("déjà vu");?>");
$("input").val(temp.html());
Это работает, так как заставляет div читать экранированный текст как закодированные символы, а затем jquery копирует эти закодированные символы во входной тег, должным образом сохраненный.
Итак, мой вопрос: это все еще безопасно или где-то есть дыра в безопасности?И что более важно, это единственный / правильный способ сделать это?Я что-то упускаю из-за того, как работает html и кодировка символов, что делает эту тривиальную проблему решаемой?
EDIT
Это на самом деле неправильно, я упростил мой пример до такой степени, что он не работает.Проблема на самом деле в том, что я использую valQ (jQuery) для вставки текста в поле.
<input>
<script>$("input").val("<?=htmlentities("déjà vu");?>");</script>
Причина этого в том, что форма динамическая - пользователь может добавлять или удалять поля по своему усмотрениюи поэтому они генерируются после загрузки страницы.
Таким образом, кажется, что jQuery сбрасывает данные для ввода во ввод, но это не совсем хорошо - если я сам ничего не делаю, пользователь все еще можетвставьте тег </script>
, убив мой код и вставив вредоносный код.Но здесь есть еще один аргумент.Так как в любом случае только оригинальный автор может видеть текст в поле ввода, стоит ли мне беспокоиться?По сути, единственные люди, на которых они могут выполнить атаку XSS, - это они сами.