Где я должен избегать строк HTML, страницы JSP или сервлета?

Я был бы признателен за предоставление мне набора четких указаний или постановлений для обработки строк с экранированием. Для экранирования строк я использую библиотеку apache commons-lang-x.x.jar. В частности, метод StringEscapeUtils.escapeHtml(String toEscape).

Мне нужно знать:

(1) Где лучше избегать строк, на странице JSP или в Servlet?

(2) Что вы рекомендуете StringEscapeUtils.escapeHtml(..) или < c: out > от JSTL

(3) Обработка многострочных строк, которая лучше, использовать <br> непосредственно в строке, или \n и метод nl2br():

String strError = "Invalid username.\nPlease try again.";

или

String strError = "Invalid username.<br>Please try again.";

(4) Как мне избежать экранов, получающих дикие карты, например:

String strError = "Invalid user [%s].<br>Please specify another user."

(5) Поскольку escape-символы javascript различны. Что я должен использовать, чтобы избежать строк Java, которые должны отображаться внутри секций javascript на странице JSP (например, var name = "<%=javaStringHoldingName%>").

Ответ 1

Вам нужно только убежать оттуда там, где это может нанести вред. В этом конкретном случае это в представлении. HTML-код, управляемый пользователем, может нанести вред, когда он будет вставлен в ваш HTML-код. Это источник для XSS.

В хорошо продуманной странице JSP (read: no scriptlets) JSTL предлагает вам тег <c:out> и fn:escapeXml() для выхода из HTML/XML.

<c:out value="${param.foo}" />
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />

Ответ 2

По двум вопросам:

1) Экранирование строк для целей отображения - я бы рассматривал это как проблему. Ваш JSP может справиться с этим, если вы используете свой JSP в качестве представления.

3) Сообщения об ошибках на уровне моделей/бизнес-логики не должны включать форматирование, например символы новой строки. Пусть ваше представление определяет способ форматирования сообщений об ошибках. С помощью HTML использование тега div с соответствующим стилем ширины может, например, исключить необходимость в тэгах br.

Ответ 3

Я бы, вероятно, не передал объект String, а просто передал объект ошибки до представления и давал jsp делать все, что захочет

В контроллере:

errorObj.name = "invalid login";
errorObj.description = "try again";

В представлении:

<c:out value="${errorObj.name}" /><br /><c:out value="${errorObj.description}" />

Не имеет отношения к вашему вопросу, но также хорошей практикой использовать такое сообщение, как "неверная попытка входа", независимо от того, какая ошибка входа в систему. Сообщение, которое вы даете, "неверное имя пользователя" позволяет кому-то задуматься о взломе ваших учетных записей, знаете ли они, что у них есть хорошее имя пользователя, которое они могут использовать, чтобы затем атаковать пароль. Если это открыто, это может быть небольшой, но очень реальной проблемой.