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

Я делал это все время в своем коде 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>? Или есть места, где мне это может понадобиться?

Ответы [ 2 ]

25 голосов
/ 04 июля 2011

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

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

<script>while (true) alert("you're a loser");</script>
7 голосов
/ 05 июля 2011

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

<%@ 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 в тексте шаблона.

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

...