2016-10-21 6 views
0

현재 Java 프로젝트에서 암호 분실 기능을 구현 중입니다. 내 방법은자바에서 비밀번호 재설정 링크

  1. 사용자는 비밀번호 찾기 링크를 클릭한다.

  2. 암호 분실 페이지에서 시스템에 등록한 주소
    주소를 입력하라는 메시지가 표시됩니다. 리셋 암호 페이지 링크가 주어진 이메일 주소를 포함

  3. 이메일.

  4. 사용자가 링크를 클릭하면 페이지로 리디렉션됩니다 (비밀번호 재설정) 사용자가 새 비밀번호를 입력 할 수 있습니다.

  5. 암호 재설정 페이지에서 "전자 메일 주소"필드가 자동으로 채워집니다.
    비활성화되어 있기 때문에 변경할 수 없습니다.

    그러면, 사용자는 자신의 새 암호 및 데이터베이스의 이메일 주소로 관련 분야 업데이트됩니다를 입력합니다.

내 코드에서 이것을 시도했지만 암호 재설정 페이지에서 암호를 변경하려는 사용자의 전자 메일 ID를 얻지 못했습니다.

MailUtil.java

package com.example.controller; 

import java.io.IOException; 
import java.security.Security; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Properties; 

import javax.mail.Message; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 

import com.example.util.Database; 

public class MailUtil { 
    private static final String USERNAME = "[email protected]"; 
    private static final String PASSWORD = "test"; 
    private static final String SUBJECT = "Reset Password link"; 

    private static final String HOST = "smtp.gmail.com"; 
    private static final String PORT = "465"; 

    String email; 

    public MailUtil() { 
    // TODO Auto-generated constructor stub 
    email = this.email; 
} 

    public boolean sendMail(String to, HttpServletRequest request) throws SQLException, ServletException, IOException{ 
     Connection conn = Database.getConnection(); 
     Statement st = conn.createStatement(); 
     String sql = "select * from login where email = '" + to + "' "; 
     ResultSet rs = st.executeQuery(sql); 
     String pass = null; 
     String firstName = null; 
     while(rs.next()){ 
      pass = rs.getString("pass"); 
      firstName = rs.getString("firstName"); 
     } 

     if(pass != null){ 
      setEmailId(to);   
      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
      Properties props = new Properties(); 
      props.put("mail.smtp.host", HOST); 
      props.put("mail.stmp.user", USERNAME); 
      // If you want you use TLS 
      //props.put("mail.smtp.auth", "true"); 

      props.put("mail.smtp.starttls.enable", "true"); 
      props.put("mail.smtp.password", PASSWORD); 
      // If you want to use SSL 
      props.put("mail.smtp.port", PORT); 
      props.put("mail.smtp.socketFactory.port", PORT); 
      props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
      props.put("mail.smtp.auth", "true"); 

      Session session = Session.getInstance(props, new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        String username = USERNAME; 
        String password = PASSWORD; 
        return new PasswordAuthentication(username, password); 
       } 
      }); 

      String from = USERNAME; 
      String subject = SUBJECT; 
      MimeMessage msg = new MimeMessage(session); 
      try{ 
       msg.setFrom(new InternetAddress(from)); 
       InternetAddress addressTo = new InternetAddress(to); 
       msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
       msg.setSubject(subject);     
       String vmFileContent = "Hello User, <br><br> Please Click <a href='http://192.168.15.159:8080/SampleLogin/new-password.jsp><strong>here</strong></a> to reset your password. <br><br><br> Thanks,<br>ProAmbi Team"; 

       // Send the complete message parts 
       msg.setContent(vmFileContent,"text/html"); 
       Transport transport = session.getTransport("smtp"); 
       transport.send(msg); 

       System.out.println("Sent Successfully"); 
       return true; 
      }catch (Exception exc){ 
       System.out.println(exc); 
       return false; 
      } 
     }else{ 
      //System.out.println("Email is not registered."); 
      request.setAttribute("errorMessage", "User with this email id doesn't exist.");   
      return false; 
     } 
    } 

    public String getEmailID() { 
     return email; 
    } 
    public void setEmailId(String email) { 
     this.email = email; 
    } 
} 

그리고 나의 새로운 password.jsp.

<% 
    MailUtil mail = new MailUtil(); 
    String email = mail.getEmailID(); 
    System.out.println("---> "+email); 
%> 

하지만 이메일 ID 대신 null 값이 있습니다.

는 행복은 나에게이 문제를 해결하거나이 작업을 수행하는 다른 옵션을 얻을 수 있습니다.

+4

그래서 당신은 인스턴스화 새 MailUtil 객체를 만든 다음 전자 메일 ID가 마술처럼 포함될 것으로 기대하십니까? – Gimby

+1

util 클래스는 기본 생성자가 없으므로 기본적으로 인스턴스 변수는 null입니다. 값을 설정하지 않았거나 sendMail 메서드를 호출하지 않으면이 인스턴스에 값이있을 것이라고 예상하지 않습니다. – AxelH

+0

@newuserua_ext, 'to'가 null 인 경우 데이터베이스에서 유용한 정보를 반환합니다. 방법 ... SQL 주입을보십시오! – AxelH

답변

2

나는 유 JWT 토큰을 사용하여 조언을 것입니다 - https://jwt.io/

public String createToken(Email mail) 
    { 
     Claims claims = Jwts.claims().setSubject(String.valueOf(mail.getId())); 
     claims.put("mailId", mail.getId()); 
     Date currentTime = new Date(); 
     currentTime.setTime(currentTime.getTime() + tokenExpiration * 60000); 
     return Jwts.builder() 
      .setClaims(claims) 
      .setExpiration(currentTime) 
      .signWith(SignatureAlgorithm.HS512, salt.getBytes()) 
      .compact(); 
    } 

이 코드는 사용자가 캐릭터 라인 표현을 토큰을 반환합니다. 그래서 u는이 토큰을 사용하여 전자 메일 메시지를 보낼 것입니다 예를 들면 : ". 당신이 요구 한 암호 변경 새 암호를 입력하려면이 링크를 클릭하십시오"

유에서 토큰을 얻을 것이다로드 페이지에서 다음

http://yourapp.com/forgotPassword/qwe213eqwe1231rfqw

을 요청하고, 인코딩하고, 원하는 것을 얻으십시오.

public String readMailIdFromToken(String token) 
    { 
    Jwts.parser().setSigningKey(salt.getBytes()).parseClaimsJws(token).getSignature(); 
    Jws<Claims> parseClaimsJws = Jwts.parser().setSigningKey(salt.getBytes()).parseClaimsJws(token);   
    return parseClaimsJws.getBody().getSubject(); 
    } 

만료되면 지정된 시간이 지나면 토큰이 유효하지 않게됩니다. 소금은 어떤 종류의 String으로 대체 될 수 있습니다. JWT 문서에서 자세한 내용을 읽을 수 있습니다. 이 접근법은 등록 구성 전자 메일에도 사용될 수 있습니다.

p.s.

1) 대신

2) SQL 쿼리 문자열 연결을 사용하지 마십시오 JSTL을 사용) JSP에서 scriplets (자바 코드를 사용하지 마십시오. 이건 위험 해. 대신 준비된 문을 사용하십시오.

3) HOST/PASSWORD e.t.c와 같은 정보. 속성 파일을 사용하십시오

4) DB를 적절한 DAO에 호출하는 코드를 제거하십시오. (당신은 DAO 패턴에 대해 읽어야합니다.)

5) 코드에서 system.out.println을 사용하지 마십시오. 모든 종류의 로거를 사용하십시오.

유용한 링크 :

https://jstl.java.net/

https://en.wikipedia.org/wiki/SQL_injection

https://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html

https://www.tutorialspoint.com/design_pattern/data_access_object_pattern.htm

https://en.wikipedia.org/wiki/Multitier_architecture

+0

오케이. 내가 확인하고 알려 드리겠습니다. – Hiten