Как защититься от xss при сохранении данных и при их отображении

Допустим, у меня есть простое приложение CRUD с формой для добавления нового объекта и редактирования существующего. С точки зрения безопасности я хочу защититься от межсайтовых скриптов. Во-первых, я бы подтвердил ввод представленных данных на сервер. Но после этого я бы избегал значений, отображаемых в представлении, потому что, возможно, у меня в базе данных было написано более одного приложения (какой-то разработчик по ошибке вставляет непроверенные данные в БД в будущем). Так что у меня будет этот JSP:

<%@ taglib prefix="esapi" uri="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API" %>
<form ...>
   <input name="myField" value="<esapi:encodeForHTMLAttribute>${myField}</esapi:encodeForHTMLAttribute>" />
</form>

<esapi:encodeForHTMLAttribute> делает почти то же самое, что и <c:out>это HTML экранирует чувствительные символы, такие как < > " так далее

Теперь, если я загружаю объект, который каким-то образом был сохранен в базе данных с myfield=abc<def вход будет правильно отображать значение abc<def в то время как значение в html позади будет abc&lt;def,

Проблема в том, что когда пользователь отправляет эту форму без изменения значений, сервер получает значение abc&lt;def вместо того, что видно на странице abc<def, Так что это не правильно. Как мне реализовать защиту в этом случае?

1 ответ

Решение

Проблема в том, что когда пользователь отправляет эту форму без изменения значений, сервер получает значение abc&lt;def вместо того, что видно на странице abc

Легко. В этом случае HTML декодирует значение, а затем проверяет.

Хотя, как отмечено в нескольких комментариях, вы должны увидеть, как мы работаем с проектом OWASP ESAPI-Java. По умолчанию мы всегда канонизируем данные, что означает, что мы запускаем серию декодеров для обнаружения многократного / смешанного кодирования, а также для создания безопасной строки для проверки с помощью регулярных выражений.

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

Кодирование - лучшая защита для XSS, и я бы порекомендовал его ДО проверки правильности ввода, если по какой-то причине вам пришлось выбирать.

Я говорю " возможно", потому что в целом я считаю плохой практикой хранить измененные данные. Это может сделать поиск неисправностей рутиной. Это может быть еще сложнее, если вы используете такую ​​технологию, как TinyMCE, текстовый редактор в браузере. Он также отображает HTML, так что это похоже на работу с браузером в браузере.

Другие вопросы по тегам