[JSP] <jsp:include>와 <jsp:param>
웹사이트 구축 열심히 하고 있다.. jsp에는 <jsp:include> 액션 태그를 이용해서 특정 jsp를 import 시킬 수 있다.
html 레이아웃의 Left 영역에 해당하는 부분의 소스를 추가할 수도 있고, 각종 <script> 들을 넣은 리소스 파일을 추가할 수도 있다.
이는 모듈화를 꾀할 수 있는 좋은 방법이 된다.
해당 include 된 jsp는 request 객체를 공유한다.
<jsp:include page="../test.jsp" flush="true" />
flush 속성은 포함 대상 JSP 페이지에 제어를 넘기기 직전에 출력 버퍼를 클라이언트로 출력하는 flush를 수행할지 여부(true, false)를 지정한다. 기본값은 false이며, flush 하지 않는다고 한다.
여기에 <jsp:param> 태그를 이용해서 공유된 request 객체 안에 parameter를 넣을 수가 있다.
<jsp:include page="../test.jsp" flush="true">
<jsp:param name="myParam" value="test" />
</jsp:include>
단, <jsp:param>은 String타입의 값만 전달할 수 있기 때문에 형변환이 필요로 하면, request.setAttribute를 이용해야 한다.
그럼 include 된 test.jsp 안에서 스크립틀릿을 이용해 parameter 정보를 가져올 수 있다.
<%
String strParam = (String)request.getParameter("myParam");
%>
...
<body>
<div>
param : <%=strParam%>
</div>
</body>
그러나.. 이렇게 request 객체에서 받아온 정보를 바로 뿌려주는 것은 XSS 보안 이슈를 야기시킨다.
해커가 request 안의 parameter정보를 '<script>alert('test')</script>' 라고 세팅해서 보내버리면 스크립트가 실행이 되어버리는 것이다.
따라서 이를 해결하기 위한 방법으로는
1. 파라미터 정보를 일일히 replaceAll 하는 방법
<%!
public String requestReplace (String paramValue, String gubun) {
String result = "";
if (paramValue != null) {
paramValue = paramValue.replaceAll("<", "<").replaceAll(">", ">");
paramValue = paramValue.replaceAll("\\*", "");
paramValue = paramValue.replaceAll("\\?", "");
paramValue = paramValue.replaceAll("\\[", "");
paramValue = paramValue.replaceAll("\\{", "");
paramValue = paramValue.replaceAll("\\(", "");
paramValue = paramValue.replaceAll("\\)", "");
paramValue = paramValue.replaceAll("\\^", "");
paramValue = paramValue.replaceAll("\\$", "");
paramValue = paramValue.replaceAll("'", "");
paramValue = paramValue.replaceAll("@", "");
paramValue = paramValue.replaceAll("%", "");
paramValue = paramValue.replaceAll(";", "");
paramValue = paramValue.replaceAll(":", "");
paramValue = paramValue.replaceAll("-", "");
paramValue = paramValue.replaceAll("#", "");
paramValue = paramValue.replaceAll("--", "");
paramValue = paramValue.replaceAll("-", "");
paramValue = paramValue.replaceAll(",", "");
if(gubun != "encodeData"){
paramValue = paramValue.replaceAll("\\+", "");
paramValue = paramValue.replaceAll("/", "");
paramValue = paramValue.replaceAll("=", "");
}
result = paramValue;
}
return result;
}
%>
2. web.xml에 filter-chain을 이용하는 방법
이건 라이브러리도 다양하다.
3. 간단하게 JSTL의 <c:out> 태그를 이용하는 방법
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String Param = (String)request.getParameter("myParam");
pageContext.setAttribute("strParam", Param);
%>
...
<div>
param : '<c:out value="${pageScope.strParam}"/>'
</div>
...
나는 이 방법을 택했는데 jstl의 <c:out> 태그는 첫 번째 방법인 replaceAll과 비슷하게 기본적으로 excapeXML이라는 속성이 true로 설정되어 있다.
<jsp:param> 은 request 객체를 공유한다고 했으니 이를 받아오기 위해 PageScope 단위의 변수를 만들어주고 html내부에서는 EL태그로 가져오면 되는 것이다.
JSP를 요새 중점적으로 다루면서 많은 것을 공부하고 있다.
그러면서 javascript가 얼마나 강력한 언어인지 다시 한번 알게 된다.
그렇지만 유저가 편해질수록 보안은 강해져야 한다.
<출처>
https://dololak.tistory.com/493
http://www.devkuma.com/books/pages/1154
https://lee-mandu.tistory.com/450?category=633568
'Back-end' 카테고리의 다른 글
[Node.js] Node.js 설치 및 REPL 터미널 실행 (0) | 2022.05.14 |
---|---|
[JSP / Spring] global.properties 변수값 가져오기 (0) | 2022.01.26 |
[Java] String을 Json객체로 형변환하기 (0) | 2021.01.20 |
[Java] 예외 발생 시키기 (0) | 2021.01.19 |
[Java] 숫자 천 단위에 컴마(,) 표시하기 (1) | 2020.12.24 |