Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка пароля,логина.. 
V
    Опции темы
jmich
Дата 10.3.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



У меня есть сервлет, страница jsp и класс подключения к базе данных. 
На странице jsp вводим логин и пароль. Как сделать проверку пароля, логина и id в базе данных? Хочу идентификацию сделать по 3-м параметрам(пароль, логин и id)

 
jsp  
Код

<core:view>
    <html:form>
        
        <h1><html:outputText value="Base avec JSF(page2)" /></h1>
        
        <html:outputText value="Login : " /> 
        <html:inputText value="#{login}" />
        
        <html:outputText value="Mot de Passe : " /> 
        <html:inputSecret value="#{password}" />
        
    
    <html:commandButton action="registrer" value="Connecter" >
                    <core:param name="id" value="#{personne_id}" />
                    <core:param name="l" value="#{login}" />
                    <core:param name="p" value="#{password}" />
                        </html:commandButton>
    </html:form>
</core:view>



Код
public List<Personne> getPass() {
        Personne personne = null;
        List<Personne> pass = new ArrayList<Personne>();
        try {

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://gp:3306/maison";
            Connection con = DriverManager.getConnection(url, "root", "root");
            Statement statement = con.createStatement();

            // Exécution d'une requete ex1
            String requete3 = "SELECT login, password, personne_id FROM personne";
        
            // System.out.println(requete1);
            ResultSet resultset = statement.executeQuery(requete3);

            // Traitement des résultats
            while (resultset.next()) {
                personne = new Personne();
                personne.setLogin(resultset.getString("login"));
                personne.setPassword(resultset.getString("password"));
                personne.setPersonne_id(resultset.getString("personne_id"));
                pass.add(personne);
            }
            // fermeture de la connexion
            con.close();

        }

        catch (ClassNotFoundException e) {
            System.err.println("Erreur lors du chargement du pilote : " + e);
        } catch (SQLException sqle) {
            System.err.print("Erreur SQL : " + sqle);
        }
        return pass;
    }



Код

public class PasswordServlet  extends HttpServlet {

        private BaseContact basecontact;
        
         public void init()
         throws ServletException{
          basecontact = new BaseContact();}
          
        public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        

            String p = request.getParameter("p");
            String l = request.getParameter("l");
            String id = request.getParameter("id");
            
            
            List<Personne> pass = BaseContact.getBaseContact().getPass();
            HttpSession session = request.getSession();
            session.setAttribute("pass", pass); 

            RequestDispatcher rd =
                request.getRequestDispatcher("faces/basejsf2.jsp");
                rd.forward(request, response);

        }
    }
    


PM MAIL   Вверх
v2v
Дата 10.3.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



а чего создал тему в разделе j2me ??
Цитата(jmich @  10.3.2008,  17:26 Найти цитируемый пост)
Хочу идентификацию сделать по 3-м параметрам(пароль, логин и id)

делаешь к базе запрос с указанным логином, паролем, ид : если вернуло одну запись : авторизация пройдена, нет - доступ запрещён.



--------------------
PM   Вверх
jmich
Дата 10.3.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



А на примере можно? 

PS Да я уже написала модератору, чтобы переместили, ошибочка вышла.

PM MAIL   Вверх
jmich
Дата 10.3.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2008

Репутация: нет
Всего: нет




нет вы меня не поняли, мне нужно на странице jsp ввести пароль и логин, потом эти параметры передаю сервлету для проверки существуют ли такие в базе данных. Если да , то сервлет возвращает новую страницу jsp, если нет остается та же страница.
PM MAIL   Вверх
v2v
Дата 10.3.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



ну стандартная задача.
вместо getPass пишешь метод checkUser куда передаёшь логин , пароль , ид .
В методе делаешь запрос 
Код

"SELECT login, password, personne_id FROM personne WHERE login='"+login_column+"' and password" .....  и т.д.

далее анализируешь респонс и делаешь редирект на другую страницу или открываешь эту же.



--------------------
PM   Вверх
VOS
Дата 11.3.2008, 12:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: нет
Всего: 8



Вариант, предложенный  v2v годится в качестве академического примера, 
но в реальной жизни его надо использовать крайне осторожно.  
Например, если введенный пользователем логин
будет такой: 
1' or 1=1 or 0=0
а пароль любой, например 555
то результирующий SQL запрос примет вид:

"SELECT login, password, personne_id FROM personne WHERE login='1' or 1=1 or 0=0 and password='555' "

этот запрос будет выполнен успешно и Вам вероятно удастся зайти в систему не зная логина или пароля.
Это простой вариант, есть и другие, более изощренные способы атаки.
 
Лучше вызывать хранимую процедуру, или использовать переменные привязки/параметризированные запросы.
Т.е. очень опасно  динамически создавать строку запроса на основе данных, которые вводит пользователь

PM MAIL   Вверх
W0LF
Дата 11.3.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: нет
Всего: 20



в jdbc например юзай PreparedStatement или экранируй все кавычки одинарные smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
v2v
Дата 11.3.2008, 14:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: 9
Всего: 56



sql иньекция ... да это проблема ) .


--------------------
PM   Вверх
jmich
Дата 11.3.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



я сделала так, но еще не проверила работает или нет...
правильно ли так? 
Код


private Object personne;
    public Object getPersonne (){
         String nom = "nom";
         String prenom = "prenom";
         String age = "age";
         String personne_id = "personne_id";
         String login = "login";
         String password = "password";

    try {

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://gp:3306/maison";
            Connection con = DriverManager.getConnection(url, "root", "root");
            Statement statement = con.createStatement();

            // Exécution d'une requete ex1
            String requete3 = "SELECT nom, prenom, age, login, password, personne_id FROM personne WHERE nom="+nom+" and prenom="+prenom+" and age='"+age+"' and login='"+login+"' and password='"+password+"' and personne_id="+personne_id+"";
            // System.out.println(requete1);
            ResultSet resultset = statement.executeQuery(requete3);

            // Traitement des résultats
            if (resultset.next()) {
                Personne personne = new Personne();
                    personne.setNom(resultset.getString("nom"));
                    personne.setPrenom(resultset.getString("prenom"));
                    personne.setAge(resultset.getString("age"));
                    personne.setLogin(resultset.getString("login"));
                    personne.setPassword(resultset.getString("password"));
                    personne.setPersonne_id(resultset.getString("personne_id"));
                
            }
            // fermeture de la connexion
            con.close();
        }
        catch (ClassNotFoundException e) {
            System.err.println("Erreur lors du chargement du pilote : " + e);
        } catch (SQLException sqle) {
            System.err.print("Erreur SQL : " + sqle);
        }
    return personne;
        
    }


PM MAIL   Вверх
jmich
Дата 11.3.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



Код
public Object personne;
   public Object getPersonne (){
    try {
 
           Class.forName("com.mysql.jdbc.Driver");
 
           String url = "jdbc:mysql://gp:3306/maison";
           Connection con = DriverManager.getConnection(url, "root", "root");
           Statement statement = con.createStatement();
 
           // Exécution d'une requete ex3
           String requete3 = "SELECT login,password,nom,prenom,age FROM personne WHERE personne_id =personne_id and login=login and password=password";
 
           //System.out.println(requete3);
           ResultSet resultset = statement.executeQuery(requete3);
 
           // Traitement des résultats
           if (resultset.next()) {
               Personne personne = new Personne();
                   personne.setNom(resultset.getString("nom"));
                   personne.setPrenom(resultset.getString("prenom"));
                   personne.setAge(resultset.getString("age"));
                   personne.setLogin(resultset.getString("login"));
                   personne.setPassword(resultset.getString("password"));
                   System.out.println(resultset.getString("age") + " " + resultset.getString("nom")
                           + " " + resultset.getString("prenom")+ " " + resultset.getString("login")
                           + " " + resultset.getString("password"));
            }
           // fermeture de la connexion
           con.close();
       }
       catch (ClassNotFoundException e) {
           System.err.println("Erreur lors du chargement du pilote : " + e);
       } catch (SQLException sqle) {
           System.err.print("Erreur SQL : " + sqle);
       }
   return personne;
   }


почему не компилирует, в чем ошибка?


PM MAIL   Вверх
AntonSaburov
Дата 11.3.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118



Хорошо бы сообщение об ошибке все-таки писать. А то рыскать по всему коду и запускать его лениво smile
PM MAIL WWW ICQ   Вверх
jmich
Дата 11.3.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



нет никаких сообщений об ошибке :(

если сервлет забирает параметры от jsp (пароль, логин, ид) 
    String p = request.getParameter("p");
    String l = request.getParameter("l");
    String idi = request.getParameter("id");

как мне их получить здесь ? 


Код

 public Object personne;
    public Object getPersonne (){
      
    try {

            Class.forName("com.mysql.jdbc.Driver");

            String url = "jdbc:mysql://gp:3306/maison";
            Connection con = DriverManager.getConnection(url, "root", "root");
            Statement statement = con.createStatement();

            // Exécution d'une requete ex3
            String requete3 = "SELECT login,password,nom,prenom,age FROM personne WHERE personne_id =personne_id and login=login and password=password";

            //System.out.println(requete3);
            ResultSet resultset = statement.executeQuery(requete3);

            // Traitement des résultats
            if (resultset.next()) {
                Personne personne = new Personne();
                    personne.setNom(resultset.getString("nom"));
                    personne.setPrenom(resultset.getString("prenom"));
                    personne.setAge(resultset.getString("age"));
                    personne.setLogin(resultset.getString("login"));
                    personne.setPassword(resultset.getString("password"));
                    System.out.println(resultset.getString("age") + " " + resultset.getString("nom")
                            + " " + resultset.getString("prenom")+ " " + resultset.getString("login")
                            + " " + resultset.getString("password")); 
                                        
            }
            // fermeture de la connexion
            con.close();
        }
        catch (ClassNotFoundException e) {
            System.err.println("Erreur lors du chargement du pilote : " + e);
        } catch (SQLException sqle) {
            System.err.print("Erreur SQL : " + sqle);
        }
    return personne;
    }

PM MAIL   Вверх
ecologist
Дата 12.3.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 5
Всего: 9



Ну видимо как-то передать из сервлета в экземпляр объекта. Я чтото не врубаюсь в проблему - ну есть сервлет. Так и вызывай из него свой объект с нужными параметрами. И работай на здоровье.
PM MAIL   Вверх
mbasil
Дата 12.3.2008, 14:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 9
Всего: 13



Почему бы не использовать BASIC аутентификацию, то есть средствами сервера. 
Потому как, если выполнять собственную аутентификацию, то теряем
возможность декларативного управления безопасностью. Можно для
аутентификации, например, использовать такой фильтр (пример взят у SUN):

Код

package filters;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import sun.misc.BASE64Decoder;

public class LoginFilter implements Filter {

  private FilterConfig config = null;

  public void init(FilterConfig config) {
    this.config = config;
  }

  public void doFilter(ServletRequest _request,
                       ServletResponse _response,
               FilterChain chain)
          throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) _request;
    HttpServletResponse response = (HttpServletResponse) _response;
    ServletContext context = config.getServletContext();

    String user = null;
    HttpSession session = request.getSession();
    if( session != null ) {
           user = (String) session.getAttribute("USERNAME");
     }
    // Check if the user has already authenticated?
    if ( user != null ) {  // Авторизация выполнена, обрабатываем запрос
     
             chain.doFilter( request, response );
    } else {

        // Check if browser is sending the user's credentials
        String credentials = request.getHeader( "Authorization" );

        if ( credentials != null ) {

            // Retrieve the credentials from the header string
            credentials = credentials.substring( 6 );
            // context.log( "<-----> Credentials = " + credentials );

            // Decode the username:password string
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] data = decoder.decodeBuffer( credentials );
            String pair = new String( data );

            // Retrieve the username portion of the credentials
            int indx = pair.indexOf(':');
            String username = pair.substring( 0, indx );
            // String password = pair.substring( indx+1 );
            // context.log("<---->"+username+"<---->"+password+"<---->");

            session.setAttribute( "USERNAME", username );

            // And then proceed with the request
            chain.doFilter( request, response );

         } else {    // Send the login challenge

            // context.log("<-----> Sending the challenge <----->");
            response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
            response.setHeader("WWW-Authenticate", "Basic realm=<Имя вашей realm>");
         }
    }
  }
  public void destroy() {
    // do nothing
  }

}


Добавлено через 10 минут и 55 секунд
Кстати проверку в базе можете делать прямо из фильтра,
хотя это нехорошо - надо все-таки начать работать с пулами
подключений и источниками данных.

Это сообщение отредактировал(а) mbasil - 12.3.2008, 14:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1545 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.