Это одно из моих полей в одном из моих jsp-файлов:
<input class = "form-input" id = "login" type = "text" name = "login"
<c:choose>
<c:when test = "${action == 'edit' && userToEdit != null}">value = "${userToEdit.login}"</c:when>
<c:when test = "${userFromForm != null}">value = "${userFromForm.login}"</c:when>
<c:otherwise>value = ""</c:otherwise>
</c:choose>
<c:if test = "${action == 'edit'}">readonly = "readonly"</c:if>>
При добавлении пользователя имя входа доступно для записи и не защищено от XSS-атаки. Могу ли я как-нибудь спастись от userToEdit.login
и userFromForm.login
? Насколько я знаю, в основном я мог бы использовать для этой цели c:out
или fn:escapeXml()
(например, с переменной). Для последнего я попробовал что-то вроде этого:
<c:set var = "loginValue" value = "${userToEdit.login}"/>
<c:set var = "loginValueForm" value = "${userFromForm.login}"/>
Внутри выберите:
<c:when test = "${action == 'edit' && userToEdit != null}">value = "${fn:escapeXml(loginValue)}"</c:when>
<c:when test = "${userFromForm != null}">value = "${fn:escapeXml(loginValueForm)}"</c:when>
В случае c:out я попробовал что-то вроде этого
<c:choose>
<c:when test = "${action == 'edit' && userToEdit != null}">value = "<c:out value = "${userToEdit.login}"/>"</c:when>
<c:when test = "${userFromForm != null}">value = "<c:out value = "${userFromForm.login}"/>"</c:when>
<c:otherwise>value = ""</c:otherwise>
</c:choose>
или что-то вроде этого:
<c:choose>
<c:when test = "${action == 'edit' && userToEdit != null}">value=<c:out value = "${userToEdit.login}"/></c:when>
<c:when test = "${userFromForm != null}">value=<c:out value = "${userFromForm.login}"/></c:when>
<c:otherwise>value = ""</c:otherwise>
</c:choose>
Ни один из них не работал. Если я укажу имя входа, например <script>alert("test")</script>
, скрипт запустится без проблем. Я пробовал другие возможности, но не нашел правильного синтаксиса (если проблема в синтаксисе). Я делаю что-то очень неправильно.
Обновление: решено. Возможно, я просто был глуп, потому что мне пришлось решать эту проблему где-то в другом месте. Когда я добавлю этот скрипт, он перейдет на страницу со списком пользователей. Пользователи перечислены с помощью пользовательского тега и принадлежащего ему класса Java. Итак, в другом jsp есть следующие части:
<%@ taglib prefix = "custom" uri = "mytags.tld" %>
и
<custom:userList />
userList
использует UserList.java (расширяет TagSupport
), и мне пришлось предотвратить XSS-атаку там. Там я использовал это:
Текст Apache Commons
и StringEscapeUtils.escapeHtml4
от этого.
Извините, я не понимаю вопроса, я очень новичок. Внутри моего jstI есть форма, использующая POST, и внутри этого входа находится одно из моих текстовых полей. Когда я попытался использовать fn:, это было похоже на тот, что в этом вопросе, он был изменен в тех частях, как написано в вопросе выше. Где-то до этой части была определена переменная 2, как я написал в вопросе выше. Извините, если моя формулировка запутанна. Я добавил скриншот о проблемной части.
Я также попробовал просто поместить туда fn вот так: <c:when test = "${action == 'edit' && userToEdit != null}">value = "${fn:escapeXml(userToEdit.login)}"< /с:когда>
Решено. Я положил свое решение в конец вопроса. Не могу сказать, может ли это быть кому-то полезно. Но возможно. Я просто пока оставлю это здесь. Пожалуйста, удалите его, если его здесь не должно быть, или дайте мне знать, что мне следует его удалить.
В следующий раз опубликуйте минимально воспроизводимый пример, чтобы люди лучше поняли, что вы на самом деле делали.
Также решения следует публиковать как ответы, а не как часть вопроса 👍🏻
Вы просто путаете XSS с экранированием вывода HTML. Если вы используете <c:out>
или ${fn.escapeXml()}
, это предотвращает отображение XSS. Теги и выражения EL выполняются на сервере. Он не выполняется сразу после ввода тега <script>
в поле ввода формы. Но он отправляется на сервер для рендеринга.
Вы можете использовать любые escape-утилиты, чтобы избежать вывода тегов html, кода js и xml в ответ.
Для дальнейшего чтения см. Межсайтовый скриптинг (XSS).
На самом деле был получен ответ: ОП хотел предотвратить XSS, но не отладил код, чтобы увидеть, где появляется скрипт.
Как будет выглядеть окончательный HTML-код, если вы используете
fn:escapeXml()
? Например, когда вы изучаете DOM, что там?