В 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>
? Или есть места, где мне все еще может понадобиться?
Ответы
Ответ 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.