Подтвердить что ты не робот

В JSTL/JSP, когда мне нужно использовать <c: out value = "$ {myVar}" /">, и когда я могу просто сказать ${myVar}

Я делал это все время в своем коде JSP:

<c:out value="${myVar}"/>

Сегодня я впервые понял, что, похоже, я также могу использовать эту более короткую версию:

${myVar}

Работает без <c:out>!

Возможно, это потому, что моя страница объявлена ​​следующим образом:

<%@ page language="java" contentType="text/html; 
charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %>

Итак, мой вопрос: могу ли я заменить <c:out> в моем коде этой более короткой версией? Есть ли причина продолжать использовать <c:out>? Или есть места, где мне все еще может понадобиться?

4b9b3361

Ответ 1

<c:out> делает больше, чем просто вывод текста. Он избегает специальных символов HTML. Используйте его (or ${fn:escapeXml()}) каждый раз, когда вы не абсолютно уверены, что текст не содержит ни одного из этих символов: ", ', <, >, &. Кроме того, у вас будет неверный HTML (в лучшем случае), сломанная страница или атаки с использованием межсайтового скриптинга (в худшем случае).

Я приведу вам простой пример, чтобы вы поняли. Если вы разрабатываете форум, а кто-то публикует следующее сообщение, и вы не используете <c:out> для отображения этого сообщения, у вас возникнет проблема:

<script>while (true) alert("you're a loser");</script>

Ответ 2

Возможно, это потому, что моя страница объявлена ​​следующим образом:

<%@ page language="java" contentType="text/html; 
charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %>

Неправда. Просто <%@page pageEncoding="UTF-8" %> было достаточно. Остаток уже по умолчанию.

EL в тексте шаблона поддерживается, так как JSP 2.0, который идет рука об руку с Servlet 2.4 (который уже вышел с 2003 года... сохраняйте актуальность). Поэтому, когда вы запускаете контейнер, совместимый с Servlet 2.4 (например, Tomcat 5.5 или новее) с объявленным API-интерфейсом Servlet 2.4 web.xml, вы сможете использовать EL в тексте шаблона.

Однако вы не должны использовать его для (re) отображения пользовательского ввода. Таким образом, не используйте его для (повторного) отображения (сохранения) заголовков запросов, запроса куки файлов, запросов URL-адресов, параметров запроса, органов запроса и т.д. Это откроет двери для Атаки XSS.