강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của beomth
beomth

câu hỏi đã được viết

Phân tích các kỹ thuật tấn công lỗ hổng khi tải xuống tệp và các trường hợp thực tế được giảng dạy bởi một học viên hack giả

[Thực hành 1-2] Tìm hiểu chức năng tải xuống tệp dựa trên JSP đã học được khi tự sản xuất nó

JasperException

Đã giải quyết

Viết

·

177

0

안녕하세요, 코드를 실행시켰을 때 JasperException 오류가 발생하여 문의드립니다.

 

구글링 했을 때는 jsp 파일이 java로 변환되고 class 생성하는 과정에서 오류가 난다고 합니다. 그래서 WAS에서 오류를 해결할 수 있다고 하는데, 윈도우즈 환경에서 WAS를 어떻게 접근할 수 있는지 모르겠습니다.

또한, WAS 말고도 다른 방법이 있는지 궁금합니다.
제 코드와 오류를 첨부하겠습니다.
감사합니다.

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*;,
                java.io.*;"
%>

<%
    FileInputStream fis = null; <!-- fileInputStream은 1byte씩 부르게 됨 -->
    BufferedInputStream bis = null; <!-- 그래서 버퍼드 클래스를 사용하면 버퍼를 이용해서 바이트스트림을 쌓아두고 효율적으로 관리 가능능-->
    BufferedOutputStream bos = null;

    String path = "C:\\Program Files\\Apache Software Foundation\\Tomcat 9.0\\webapps\\ROOT\\upload\\image\\";
    String org_filename = request.getParameter("org_filename"); <!-- get 메소드를 받아오는 게 아님. 그냥 입력값을 받는 것.-->
    String real_filename = request.getParameter("real_filename");

    if(org_filename = null || real_filename = null) {
        out.println("<script>alert('파일명이 입력되지 않았습니다.');history.back(-1)</script>");
        return;
    }

    try {
        File fd = new File(path + real_filename);
    
        if(!fd.exists()) {   <!-- 파일이 없으면 -->
            out.println("<script>alert('파일이 존재하지 않았습니다.');history.back(-1)</script>");
            return;
        }
        response.setHeader("Content-Type", "application/octect-stream");    <!-- 임의의 파일 -->
        response.setHeader("Content-Disposition", "attachment; filename=" + org_filename);   <!-- 다운받을 때 셋팅되는 파일 이름-->
        
        <!-- 파일 -> Byte -> Buffer -> user -->
        fis = new FileInputStream(fd);  <!-- 파일 객체가 들어와도 ㄱㅊ-->
        bis = new BufferedInputStream(fis);
        bos = new BufferedOutputStream(response.getOutputStream);

        byte[] buffer = new byte[1024];
        int i = 0;

        <!-- bis에 있는 값을 buffer로 불러왔는데, 이제 옮길게 없다면 -1이 반환됨 -->
        while((i=(bis.read(buffer))) != -1) {
            bos.write(buffer, 0, i);
        }
        bos.flush();
    } finally { <!-- 객체를 중지시키는 곳-->
        if(fis != null) <!-- 객체 생성이 제대로 되었다면--> fis.close();
        if(bis != null) bis.close();
        if(bos != null) bos.close();
    }

%>

오류

타입 예외 보고

메시지 org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp

설명 서버가, 해당 요청을 충족시키지 못하게 하는 예기치 않은 조건을 맞닥뜨렸습니다.

예외

org.apache.jasper.JasperException: org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:589)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:425)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
근본 원인 (root cause)

org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:197)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
근본 원인 (root cause)

java.lang.ClassNotFoundException: org.apache.jsp.download1_jsp
	java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:129)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:58)
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:192)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
비고 근본 원인(root cause)의 풀 스택 트레이스를, 서버 로그들에서 확인할 수 있습니다.
모의해킹

Câu trả lời 2

0

beomth님의 프로필 이미지
beomth
Người đặt câu hỏi

문제 해결했습니다!

우선 몇 가지 구문 오류를 수정했고, 결과적으로는 <!-- -->를 사용한 주석이 문제였습니다.

주석을 사용하려면 <%-- --%>를 사용해야 합니다.

그 이유는, JSP -> java -> class로 변환되는 과정에서, <% ~~ %> 안에 있는 코드는 java로 해석됩니다. 근데 java에서는 html 주석과 다르게 //로 사용하기 때문에 오류를 발생합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

버럼님께서 겪고 계신 JasperException 오류는 JSP 파일이 Java로 변환되고, 그 결과 생성된 클래스 파일을 찾지 못할 때 발생하는 문제를 의미합니다. 이 문제의 근본 원인은 여러 가지가 있을 수 있지만, 다음과 같은 측면에서 해결책을 제안 드리겠습니다.

1. JSP 파일 경로 확인

  • 먼저 JSP 파일의 경로가 올바르게 설정되었는지 확인해보세요. 특히, JSP 파일이 실제 웹 애플리케이션의 경로에 위치하고 있는지 확인해야 합니다.

2. JSP 파일의 문법 오류 수정

  • 코드 상에서 몇 가지 문법 오류를 발견했습니다. 예를 들어, import 문에서 세미콜론 ;이 여러 줄에 걸쳐 잘못 사용되었으며, if 문에서 =는 값을 비교하는 것이 아닌, 할당 연산자입니다. 이를 ==로 수정해야 합니다.

수정된 부분:

  <%@ page import="java.util.*, java.io.*" %>
  
  if (org_filename == null || real_filename == null) {
      out.println("<script>alert('파일명이 입력되지 않았습니다.');history.back(-1);</script>");
      return;
  }

3. Tomcat 설정 확인

  • Tomcat 설정 파일인 web.xml에서 JSP 서블릿이 올바르게 설정되었는지 확인해보세요. 기본적으로 자동 설정되어야 하지만, 사용자 설정이 변경된 경우 확인이 필요합니다.

4. JSP 파일 권한 및 캐시 삭제

  • JSP 파일의 읽기 권한이 제대로 설정되어 있는지 확인하세요. 경우에 따라서는 Tomcat의 작업 디렉터리에 캐시된 컴파일된 JSP 클래스를 삭제하고 Tomcat을 재시작하는 것도 도움이 될 수 있습니다. 이러한 캐시는 일반적으로 work 디렉터리에 위치하고 있습니다.

5. Tomcat 로그 확인

  • 더 구체적인 문제 분석을 위해 Tomcat의 logs 디렉터리에서 catalina.out 또는 localhost.log 파일을 확인하세요. 여기에는 오류의 더 많은 정보를 제공할 수 있는 추가 세부 사항이 기록됩니다.

관련해서 더 구체적인 조언이 필요하시다면, JSP 파일을 찾을 수 없는 경우에 대한 기존 Q&A 게시물을 참고해 주세요. 가능한 유사한 환경에서 발생한 문제 해결 방안이 큰 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Hình ảnh hồ sơ của beomth
beomth

câu hỏi đã được viết

Đặt câu hỏi