2017-02-06 5 views
2

現在、このメソッドを使用して、バックエンドにユーザー名とパスワードを送信し、データベースで有効かどうかを確認しています。ここ コード:私が知りたいJavaでユーザー名とパスワードをバックエンドに送信する方法を教えてください。

@GET 
@Path("/login/{username}/{passWord}") 
public Boolean Login(@PathParam("username") String username, @PathParam("passWord") String password) { 
    LoginService login = new LoginService(); 
    boolean response = login.LoginCheck(username, password); 
    return response; 
} 

そしてLoginServiceに私が検証するために、このメソッドを使用しています::

public class LoginService { 
    private int count;  
    public LoginService() {}     
    public boolean LoginCheck(String uname, String password) { 
     SessionFactory factory = new Configuration().configure().buildSessionFactory(); 
     Session session = SessionUtil.getSession(); 
     String hql = "select reg.name,reg.password from Employee as reg where reg.name='" + uname + "' and reg.password='" + password + "'"; 
     Query query = session.createQuery(hql); 
     for (Iterator it = query.iterate(); it.hasNext();) {    
      it.next(); 
      count++; 
     } 
     System.out.println("Total rows: " + count); 
     if (count == 1) { 
      return true; 
     } else { 
      return false; 
     } 
    }  
} 

は、ユーザー名とパスワードを送信するために、他の安全な方法はありますか?ここに示すように、ユーザー名とパスワードはURLに反映されます。

ありがとうございました。

+3

パスワードをプレーンテキストで保存しないでください。クライアント上のパスワードをハッシュ(salt)でハッシュします。サーバーに送信し、保存されたハッシュに対してそのハッシュをチェックしてください –

+1

パスワードを平文で送信することは問題ありません。*セキュリティで保護された接続(HTTPSなど)を使用している場合 - クライアントからの 'stored hash'ハッシュ*は平文パスワードになります。バックエンドでは、パスワード管理と保存(有効なハッシュアルゴリズム、ソルト、セキュリティ原則の分離などを含む)の標準的なルールに従ってください。このトピックは打ちのめされており、Too Broadとして投票しています。 – user2864740

答えて

1

あなたは基本認証RFC 2617)を使用することを検討してください:あなたは、Hibernateでかなり簡単来て準備された文とパラメータを、使用する必要があります。それはように見えるかもしれ実装するサーブレットフィルタ:

package transfer.util; 

import static org.apache.commons.lang3.StringUtils.*; 

import java.io.IOException; 
import java.security.Principal; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import javax.ws.rs.core.HttpHeaders; 

import org.omnifaces.filter.HttpFilter; 

import transfer.business.users.entity.Roles; 

@WebFilter("/api/*") 
public class BasicAuthFilter extends HttpFilter { 

    @Override 
    public void doFilter(final HttpServletRequest request, final HttpServletResponse response, final HttpSession session, final FilterChain chain) throws ServletException, IOException { 

     // insert cookie erasure here if needed 

     dontCache(response); 

     final String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION); 

     if (isNotBlank(authHeader)) { 
      if (isValid(authHeader)) { 
       chain.doFilter(wrapRequest(request, new SimplePrincipal(webHookUser, Roles.ISSUETRACKER)), response); 
      } else { 
       sendAuthError(response); 
      } 
     } else { 
      sendAuthError(response); 
     } 
    } 

    private void dontCache(final HttpServletResponse response) { 
     response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
     response.setHeader("Pragma", "no-cache"); 
     response.setDateHeader("Expires", 0); 
    } 

    private boolean isValid(final String authHeader) { 
     // check credentials and return true or false 
    } 

    private HttpServletRequest wrapRequest(final HttpServletRequest request, final SimplePrincipal principal) { 
     final HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) { 
      @Override 
      public Principal getUserPrincipal() { 
       return principal; 
      } 

      @Override 
      public String getRemoteUser() { 
       return principal.getName(); 
      } 

      @Override 
      public boolean isUserInRole(final String role) { 
       return principal.getRoles().contains(role); 
      } 
     }; 
     return wrapper; 
    } 

    private void sendAuthError(final HttpServletResponse response) throws IOException { 

     response.setHeader("WWW-Authenticate", "Basic realm=\"default\""); 
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 
} 

この例ではOmniFacesApache Commons Langを利用しています。ユーザー資格情報の具体的な検証クエリは表示されません。 Giovanni Lovatos answerを参照してください。パラメータ化されたSQLクエリ。彼が言及しているように、これは、トランスポート暗号化とサーバー認証、およびオプションでクライアント認証を証明書によって追加するHTTPS上でのみ安全です。 HTTPS/TLSの設定は、Javaアプリケーションサーバーの実装によって異なります。

0

要求URL内のフィールドの両方を有する妨げるPOST要求、可能性があなたのバックエンドにユーザ名とパスワードのデータを送信するために安全な方法:あなたがHTMLを使用している場合は、

@POST 
@Path("/login") 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public boolean login(@FormParam("username") String username, 
        @FormParam("password") String password) { 
    LoginService login = new LoginService(); 
    boolean response = login.LoginCheck(username, password); 
    return response; 
} 

その後ログインするためのフォーム、あなたはこのようなものがあります:それはTLSで実行中のサービスを持つことが、セキュリティのために必須ですのでPOST要求はまだ、その本体にクリアテキストでパスワードを持っていることを

<form method="post" action="/login"> 
    <input type="text" name="username"> 
    <input type="password" name="password"> 
</form> 

注(すなわち、以上HTTPS)。

特に、パスワードが関係している場合は、文字列連結を使用してSQLクエリを構築することは絶対に避けてください。SQLインジェクション [1]になる可能性があります。

String hql = "select reg.name, reg.password from Employee as reg where reg.name = ? and reg.password = ?"; 
Query query = session.createQuery(hql); 
query.setParameter(1, uname); 
query.setParameter(2, password); 
  1. https://en.wikipedia.org/wiki/SQL_injection
+1

POSTを使用するときれいですが、あまり安全ではありません。あなたの背中の誰かがパラメータを見ることができないようにするだけですが、リクエストでフォームパラメタを見つけるのは難しくありません。しかし、 'PreparedStatement'を使う方が良いでしょう! – AxelH

+0

@AxelHサービスをTLS経由で実行するというメモを追加しました。 –

関連する問題