аутентификация пользователя с использованием сервлетов / glassfish: проблема безопасности - PullRequest
0 голосов
/ 28 декабря 2011

Я разрабатываю аутентификацию для входа в систему с использованием jsp / servlets и glassfish v3.
В основном страница JSP имеет форму, которая вызывает сервлет. Затем сервлет проверяет имя пользователя и пароль из базы данных и будет аутентифицироваться на основании этого.
Я не обладаю достаточным опытом в вопросах безопасности, касающихся аутентификации пользователей (впервые я создаю один с использованием сервлетов), и у меня есть некоторые проблемы, которыми я хотел бы поделиться:
- «Форма» вызывает сервлет: / auth.
Если все в порядке после того, как сервлет обработает информацию, он будет перенаправлен на страницу jsp. Однако я заметил, что могу поместить URL-адрес, указывающий на сервлет в браузере, например: localhost: 8080 / myapp / auth , и он будет перенаправлен на страницу jsp, даже не авторизовавшись при входе в систему. механизм.
Я написал некоторые условия if / else в сервлете, чтобы предотвратить это в случае, если имя пользователя / пароль не были найдены действительными. Однако я уверен, что есть лучший и профессиональный способ сделать это, кто-нибудь может помочь с этим?
- И так, можно ли отключить просмотр прямо в сервлете браузера? например, если пользователь вводит в поле URL браузера: localhost: 8080 / myapp / auth , я хочу, чтобы ему было отказано в доступе. Можно ли это сделать?
- Кроме того, при использовании: getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/something.jsp").forward(request, response);
Форвард отображает имя моего сервлета в пути URL, то есть если я был по адресу: localhost: 8080 / myapp / , после этого форварда я получаю: localhost: 8080 / myapp / auth, Можно ли не отображать часть "auth" в URL после этой пересылки?

КОД:
HTML-форма

<form action= "auth" method = "POST">

    <tr>
    <td>Enter your name :</td>
    <td><input type = "text" name = "username"></td>
</tr><br>
<tr>
    <td>Enter your password :</td>
    <td><input type = "password" name = "password"></td>
</tr><br>
<tr>
    <td><input type = "submit" name = "submit" "></td>
</tr>

</form>

Функция processRequest моего "auth" сервлета:

 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    try {

            //Instantiate login Command
            String cmdPath = "DomainLogic.Commands.login";

            user usr = (user) cmdFactory.getInstance().getCommand(cmdPath).execute();

            if(usr!=null && usr.isLoggedIn())
            {
                request.getSession(false).setAttribute("ok", usr);
                getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/main.jsp").forward(request, response);

            }

        else
            response.sendRedirect("/index.jsp");

    } finally {}
} 


мой сервлет "auth" в web.xml

<servlet>
    <servlet-name>auth</servlet-name>
    <servlet-class>bridge.auth</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>auth</servlet-name>
    <url-pattern>/auth</url-pattern>   
</servlet-mapping>

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

Однако я заметил, что могу указать в браузере URL-адрес, указывающий на сервлет, например: localhost: 8080 / myapp / auth, и он будет перенаправлен на страницу jsp, даже не авторизовавшись при входе в систему.механизм.

Ваша главная ошибка в том, что вы делегировали doGet() и doPost() одному и тому же пользовательскому методу processRequest().Вам не следует этого делать.

doGet() следует использовать для предварительной обработки запросов GET (например, после ссылки / закладки, ввода URL-адреса в адресной строке браузера и т. Д.), А doPost() должно бытьиспользуется для постобработки POST-запросов (например, отправленных <form method="post">).

Вам нужно изменить processRequest(), чтобы он был единственной работой метода doPost(), и позволить doGet() делать что-то еще,например, отображение страницы входа.Это также мгновенно решит вашу другую «проблему» (это на самом деле не проблема, а серьезное заблуждение, я также не понимаю, почему это будет проблемой безопасности, если не считать плохой код) возможности доступа к сервлетам по URLнапрямую: просто скройте все JSP, включая страницу входа, в /WEB-INF, чтобы вы могли получить JSP только с помощью сервлета doGet().Я бы только изменил URL сервлета /auth на что-то более разумное для конечного пользователя, например /login.

См. Также:

0 голосов
/ 29 декабря 2011

Похоже, вы дублируете функции, доступные в Java EE 6. Почему не используется область JDBC и Java EE 6 аутентификация на основе форм ? Вот документация по области JDBC .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...