簡體   English   中英

驗證電子郵件地址和密碼

[英]Validate email address and password

如何在用戶登錄時驗證某個電子郵件和密碼?

protected void doPost(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException {

    String email=request.getParameter("email");
    String pass=request.getParameter("pass");

    OutputStream out = res.getOutputStream();

    try{
           Class.forName("com.mysql.jdbc.Driver");
           Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/college", "root", "root");
           Statement st=con.createStatement();
           String strSQL = "SELECT email,password FROM student";

SELECT語句后如何繼續? 我更喜歡使用if...else語句來進行驗證。

首先正確關閉所有連接資源 - 使用Java 7 try-with-resources。

這是一個簡單的例子:

final String email = request.getParameter("email");
final String pass = request.getParameter("pass");
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root");
        final PreparedStatement statement = con.prepareStatement("SELECT COUNT(*) AS count FROM student WHERE email=? AND password=?");) {
    statement.setString(1, email);
    statement.setString(2, pass);
    try (final ResultSet resultSet = statement.executeQuery()) {
        if (resultSet.next()) {
            final int rows = resultSet.getInt("count");
            if (rows > 1) {
                throw new IllegalStateException("More than one row returned!");
            }
            boolean validUser = rows == 1;
        }
    }
}

但實際上你應該在數據庫中散列密碼 使用像jBcrypt這樣的東西 您的代碼將如下所示:

final String email = request.getParameter("email");
final String pass = request.getParameter("pass");
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root");
        final PreparedStatement statement = con.prepareStatement("SELECT pass FROM student WHERE email=?");) {
    statement.setString(1, email);
    statement.setString(2, pass);
    try (final ResultSet resultSet = statement.executeQuery()) {
        if (resultSet.next()) {
            final String hash = resultSet.getString("pass");
            final boolean valid = BCrypt.checkpw(pass, hash);
        }
    }
}

顯然,如果查詢中沒有返回任何行,則需要添加錯誤檢查。 您還需要檢查是否只返回一行。 但我把它留作練習。

如果你願意,可以使用if。 使用input作為where語句,然后檢查是否存在匹配,錯誤或null,然后執行您希望它執行的任何操作。

您可以在SQL語句本身中使用電子郵件和密碼。 喜歡:

SELECT email, password from student where email = ? and password = ?

准備上面的語句並綁定參數。

這種方式驗證將在DB上完成,您只需要檢查結果計數(必須為1)。 您應該在電子郵件列上具有索引以獲得更好的SQL性能。

你轉發需要取得所有students嗎?

    PreparedStatement st = con.prepareStatement("SELECT count(*) FROM student WHERE email=? AND password=?");
    st.setString(1, email);
    st.setString(2, pass);
    ResultSet rs = st.executeQuery();
    rs.next();
    int count = rs.getInt(1);
    if (count == 1) {
        // password and email are correct
    }

對於這個答案,我假設通過“驗證電子郵件和密碼”,您的意思是您希望根據用戶的電子郵件地址和密碼對用戶進行身份驗證。 而不是你想檢查電子郵件地址是否是真實的電子郵件地址。

因此, 您需要做的第一件事是使用哈希算法和隨機鹽加密數據庫中的密碼 您將哈希密碼記錄在鹽旁邊。

接下來的事情是,當用戶登錄時,您查找該用戶的salt,並使用salt執行相同的哈希。 然后將其結果與先前保存的密碼哈希進行比較,如果它們相同,則密碼相同。

對於每個用戶來說,鹽是隨機的並且不同是很重要的。

在互聯網上的上述術語中可以找到大量的閱讀材料。

完成后,您還應該在其他答案中應用非常明智的建議,只選擇您想要的用戶,並正確處理您的資源。

警告我不是安全專家,你也不是。 如果您正在為練習實施登錄系統,那很好。 如果是現實世界,請使用由知道自己正在做什么的人寫的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM