Как защититься от 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<def
,
Проблема в том, что когда пользователь отправляет эту форму без изменения значений, сервер получает значение abc<def
вместо того, что видно на странице abc<def
, Так что это не правильно. Как мне реализовать защиту в этом случае?
1 ответ
Проблема в том, что когда пользователь отправляет эту форму без изменения значений, сервер получает значение
abc<def
вместо того, что видно на странице abc
Легко. В этом случае HTML декодирует значение, а затем проверяет.
Хотя, как отмечено в нескольких комментариях, вы должны увидеть, как мы работаем с проектом OWASP ESAPI-Java. По умолчанию мы всегда канонизируем данные, что означает, что мы запускаем серию декодеров для обнаружения многократного / смешанного кодирования, а также для создания безопасной строки для проверки с помощью регулярных выражений.
Однако для той части, которая действительно гарантирует вам защиту, вы, как правило, хотите, чтобы на сервере хранился необработанный текст, а не что-либо, содержащее символы HTML, поэтому вы можете хранить неэкранированную строку, если только вы можете безопасно ее кодировать, когда вы отправить его обратно пользователю.
Кодирование - лучшая защита для XSS, и я бы порекомендовал его ДО проверки правильности ввода, если по какой-то причине вам пришлось выбирать.
Я говорю " возможно", потому что в целом я считаю плохой практикой хранить измененные данные. Это может сделать поиск неисправностей рутиной. Это может быть еще сложнее, если вы используете такую технологию, как TinyMCE, текстовый редактор в браузере. Он также отображает HTML, так что это похоже на работу с браузером в браузере.