이 javaservlet 로그인 페이지 보안 문제를 방지하는 방법

Kavindu Ravishka :

나는 자바를 사용하여 로컬 호스트에서 웹 응용 프로그램을 개발하고 있어요. 이는 폼 기반 인증을 이용한다. 내 웹 사이트의 이름은 웹 DB-관리자입니다. JDK 8 TomEE 7.0을 사용하여 임

이건 내 코드입니다

index.jsp를

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Login</title>
        <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body>
    <center><h1>Hello World!</h1></center>
        <form action="Controller" method="post">

            <center>

            <div>
            <table>
            <tr>
                <td>
                    <input type="text" class="form-control" name="username">
                </td>
            </tr>

            <tr>
                <td>
                    <input type="password" class="form-control" name="password">
                </td>
            </tr>

            <tr>
                <td>
                    <input type="submit" class="btn btn-success" value="login">
                </td>
            </tr>
            </table>

            </div>
            </center>



</form>
    </body>
</html>

Controller.java (서블릿)

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



@WebServlet(urlPatterns = {"/Controller"})
public class Controller extends HttpServlet {
    private Authenticator auth = new Authenticator();


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.sendRedirect("Welcome.jsp");
    }


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if(auth.match(username, password)) {
            doGet(request,response);
        }
        else {
            request.setAttribute("error", "Unknown user, please try again");
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        }
    }


    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

Authenticator.java (안 서블릿)

public class Authenticator {
    private String username;
    private String password;

    public Authenticator(){
        this.username="administrator";
        this.password="admin";
    }

    public Boolean match(String user,String pass){
        if(user.equals(this.username) && pass.equals(this.password)){
            return true;
        }else{
            return false;
        }
    }
}

나는 올바른 사용자 이름과 암호를 제공 할 때 함께 잘 작동하고 그것은 나를 리디렉션 위해 welcome.jsp의 내가 가고 싶은 페이지를 참조하십시오. 내가 잘못된 정보를 제공 한 경우 그리고 그것은 다시 사용자 이름과 암호를 입력하라고 요구합니다. 괜찮아

나는 다음과 같은 URL을 입력 할 때 그러나 문제는 수동으로는 위해 welcome.jsp 페이지로 저를 리디렉션입니다 어떤 사용자 이름이나 암호없이

http://localhost:8080/web-db-manager/Controller

나는이 보안 버그를 방지하기 위해 무엇을해야 그럼 ... 같은 것을 일어나는 이유는 무엇입니까

Silverfang :

그럼 대답은 아주 분명하다. 수동으로 URL을 입력하면 그것은 GET 요청으로 처리됩니다 및 doGet()방법은 호출됩니다.

당신이, 당신의 내부 원하지 않는 경우 doGet()그래서 당신의 로그인 페이지로 리디렉션 페이지를 사람의 시도가 수동으로 URL을 입력하는 경우는 로그인 페이지로 리디렉션됩니다

그런 다음의 doPost 기능 즉보다는 호출 내부 doGet()자격 일치 그냥 직접 홈 페이지 또는 시작 페이지로 리디렉션 할 때 기능을

추천

출처http://43.154.161.224:23101/article/api/json?id=318401&siteId=1