Member 14813764 Ответов: 2

Что я могу сделать, чтобы решить эту проблему


Я работаю с jsp и сервлетом с подключением postgresql.Я создал страницу входа в систему с помощью jsp, но не смог войти в систему.Пожалуйста, помогите мне найти ошибку в моем коде.

Что я уже пробовал:

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/login")
public class login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public login() {
        super();
       
    }

	 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //HttpSession session=request.getSession();
		
		PrintWriter out=response.getWriter();
		
		String un=request.getParameter("email");
		String pw=request.getParameter("pwd");
		
		                                                                                     
		try {
			Class.forName("org.postgresql.Driver");
		 
		Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres","postgres","tumbi"); // gets a new connection
 
		PreparedStatement ps = c.prepareStatement("select email,password from student where email=? and password=?");
		ps.setString(1, un);
		ps.setString(2, pw);
		
		ResultSet rs = ps.executeQuery();
 
		while (rs.next()) {
			response.sendRedirect("update.jsp");
			return;
		}
		response.sendRedirect("error.jsp");
		return;
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

2 Ответов

Рейтинг:
1

OriginalGriff

Во-первых, вы не должны хранить пароли в виде обычного текста: это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] - он основан на C#, а не на Java, но принцип тот же самый.

И помните: это веб-приложение, если у вас есть какие-либо пользователи из Европейского Союза, то применяется GDPR, а это означает, что вы должны обрабатывать пароли как конфиденциальные данные и хранить их безопасным и безопасным способом. Текст-это ни то, ни другое, и штрафы могут быть ... ГМ ... выдающийся. В декабре 2018 года немецкая компания получила относительно низкий штраф в размере 20 000 евро именно за это.

И чтобы найти вашу проблему, вам нужно использовать отладчик и точно выяснить, что происходит - у нас нет доступа к вашему пользовательскому вводу или вашей БД - и вам нужно и то, и другое, чтобы следить за проблемой.


Рейтинг:
1

MadMyche

Помимо проблемы хранения паролей, на которую указал OriginalGriff, сама команда SQL неэффективна.
Если у вас уже есть параметры, которые вы ищете (в данном случае имя пользователя и пароль), то нет необходимости возвращать их в результирующий набор.
То, что вы на самом деле ищете, - это посмотреть, есть ли совпадение в таблице для этой комбинации; что можно сделать с помощью SELECT Count(*) FROM запрос, чтобы получить, сколько раз он находится в таблице. Это позволит устранить WHILE цикл в вашем коде, так как вам просто нужно получить возвращаемое значение 1 (и только 1), а затем проверить, есть ли в таблице 1 (и только 1) совпадение.

PreparedStatement ps = c.prepareStatement("SELECT Count(*) FROM student WHERE email=? AND password=?");
ps.setString(1, un);
ps.setString(2, pw);

ResultSet rs = ps.executeQuery();
rs.next();
int matchUnPw = rs.getInt(1);

if (matchUnPw == 1) { 
	response.sendRedirect("update.jsp");
	return;
}
response.sendRedirect("error.jsp");
return;
Теперь, если вы должны сделать так, как было предложено, и использовать Хэширование метод (например, BCrypt) для хранения паролей, мы можем просто изменить запрос, чтобы получить хэшированный пароль из базы данных. Опять же, должен быть только один пример. Как только у нас есть этот хэш, мы можем передать его в любую процедуру проверки пароля/хэша, которая у вас есть.

Обратите внимание в этом примере, что пароль не передается в запрос и не используется до тех пор, пока не будет вызвана процедура проверки. Также обратите внимание, что Validate-это псевдокод, и его фактическое имя и аргументы будут варьироваться в зависимости от того, какой метод вы используете для хэширования
PreparedStatement ps = c.prepareStatement("SELECT HashedPassword FROM student WHERE email=?");
ps.setString(1, un);

ResultSet rs = ps.executeQuery();
rs.next();
string storedHash = rs.getString(1);

if (Validate(pw, storedHash) { // pseudocode 
	response.sendRedirect("update.jsp");
	return;
}