diff --git a/src/main/java/nlib/cmm/NlibCommonController.java b/src/main/java/nlib/cmm/NlibCommonController.java index e2ababa5..7c26a9c9 100644 --- a/src/main/java/nlib/cmm/NlibCommonController.java +++ b/src/main/java/nlib/cmm/NlibCommonController.java @@ -29,6 +29,7 @@ import nlib.security.SecUserVO; import nlib.user.service.LoginService; import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; +import nlib.util.UUID; /** *
@@ -404,4 +405,39 @@ public class NlibCommonController {
return StringUtil.isEmpty(value) ? defValue : value;
}
+ /**
+ * 세션에 CSRF 방지를 위한 토큰을 생성한다.
+ *
+ * @param request
+ */
+ public final static String SESSION_CSRF_TOKEN_NAME = "SESSION_CSRF_TOKEN";
+
+ public String generateCsrfToken(HttpServletRequest request) {
+ HttpSession session = request.getSession();
+ String token = UUID.getNewUUID();
+ session.setAttribute(SESSION_CSRF_TOKEN_NAME, token);
+ log.debug("generateCsrfToken > " + session.getAttribute(SESSION_CSRF_TOKEN_NAME));
+
+ return token;
+ }
+
+ /**
+ * 입력받은 CSRF 토큰이 유효한지 확인한다.
+ *
+ * @param request
+ * @param pToken
+ * @return
+ */
+ public boolean isValidCsrfToken(HttpServletRequest request, String pToken) {
+
+ HttpSession session = request.getSession();
+ String sToken = (String)session.getAttribute(SESSION_CSRF_TOKEN_NAME);
+
+ if(request == null || StringUtil.isEmpty(pToken) || StringUtil.isEmpty(sToken)) return false;
+
+ if(sToken.equals(pToken)) return true;
+
+ return false;
+ }
+
}
diff --git a/src/main/java/nlib/col/web/ReadController.java b/src/main/java/nlib/col/web/ReadController.java
index c3e76306..2faf1001 100644
--- a/src/main/java/nlib/col/web/ReadController.java
+++ b/src/main/java/nlib/col/web/ReadController.java
@@ -70,7 +70,7 @@ public class ReadController extends NlibCommonController {
*/
@Secured("ROLE_USER")
@RequestMapping(value={"/read/confirmReadFromCart.do", "/read/confirmRead.do"})
- public String confirmRent(HttpServletRequest request, CollectionVO readVO, ModelMap model) throws Exception {
+ public String confirmRent(HttpServletRequest request, CollectionVO readVO, String csrfToken, ModelMap model) throws Exception {
String retJsp = "nlib/read/confirmRead";
boolean fromCart = request.getServletPath().contains("Cart.do");
@@ -82,11 +82,17 @@ public class ReadController extends NlibCommonController {
return retJsp;
}
+ if(!fromCart && !isValidCsrfToken(request, csrfToken)) {
+ model.addAttribute("message", "잘못된 접근입니다.");
+ return retJsp;
+ }
+
if(readVO == null || StringUtil.isEmpty(readVO.getSelItems())) {
model.addAttribute("message", "대출(예약)신청할 정보가 없습니다.");
return retJsp;
}
+
String selItems = readVO.getSelItems();
List list = collectionService.makeInfoListOfCollectionVO(selItems, mbInfoId);
diff --git a/src/main/java/nlib/col/web/RentController.java b/src/main/java/nlib/col/web/RentController.java
index d6521dde..c723e23c 100644
--- a/src/main/java/nlib/col/web/RentController.java
+++ b/src/main/java/nlib/col/web/RentController.java
@@ -218,7 +218,7 @@ public class RentController extends NlibCommonController
@Secured("ROLE_USER")
@RequestMapping(value={"/rent/confirmRentFromCart.do", "/rent/confirmRent.do"})
- public String confirmRent(HttpServletRequest request, CollectionVO rentVO, ModelMap model) throws Exception {
+ public String confirmRent(HttpServletRequest request, CollectionVO rentVO, ModelMap model, String csrfToken) throws Exception {
boolean fromCart = request.getServletPath().contains("Cart.do");
@@ -229,6 +229,11 @@ public class RentController extends NlibCommonController
return "nlib/rent/confirmRent";
}
+ if(!fromCart && !isValidCsrfToken(request, csrfToken)) {
+ model.addAttribute("message", "잘못된 접근입니다.");
+ return "nlib/rent/confirmRent";
+ }
+
if(rentVO == null || StringUtil.isEmpty(rentVO.getSelItems())) {
model.addAttribute("message", "대출(예약)신청할 정보가 없습니다.");
return "nlib/rent/confirmRent";
diff --git a/src/main/java/nlib/sch/web/NlibSearchController.java b/src/main/java/nlib/sch/web/NlibSearchController.java
index 36abc021..232a804d 100644
--- a/src/main/java/nlib/sch/web/NlibSearchController.java
+++ b/src/main/java/nlib/sch/web/NlibSearchController.java
@@ -352,6 +352,12 @@ public class NlibSearchController extends NlibCommonController {
imagePath = StringUtil.getString(vo.getRprsThumbUrl(),"");
}
+ // CSRF 토큰 생성 (2021.12.02 KKN 추가)
+ String token = generateCsrfToken(request);
+ model.addAttribute("csrfToken", token);
+ log.debug("searchItemDetail > token=" + token);
+ log.debug("searchItemDetail > session token=" + session.getAttribute(SESSION_CSRF_TOKEN_NAME));
+
model.addAttribute("imageType",imageType);
model.addAttribute("imagePath",imagePath);
model.addAttribute("keywordList",keywordList);
diff --git a/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp b/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp
index 545135ff..fc8a27cb 100644
--- a/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp
+++ b/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp
@@ -1,3 +1,4 @@
+<%@page import="nlib.cmm.NlibCommonController"%>
<%
/**
*
@@ -35,6 +36,7 @@
${result.title}