Имеет ли смысл отправлять весь объект на веб-интерфейс (включая пароль)? - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть следующая таблица базы данных:

User 
----------
userId (int)
name (varchar)
email (varchar)
password (varchar) //is hashed
creditCard (varchar)

Во время входа я проверяю адрес электронной почты и пароль в базе данных, возвращая имя и идентификатор пользователя.

@NamedQuery(name = User.LOGIN, query = "SELECT u.userId, u.name FROM User u WHERE u.email = :email AND u.password = :password") 

, который возвращает мне ArrayList, который я не могу преобразовать в пользовательский объект.

0 =
  > 0 = 1
  > 1 = "Bob"

Поэтому я всегда создаю новый объект, устанавливаю значения и возвращаю этот объект в пользовательский интерфейс.

User newUser = new User;
newUser.setUserId(userObject[0]);
newUser.setName(userObject[1]);

Я также мог бы select u from User u, привести результат к пользовательскому объекту и отправить во внешний интерфейс, но я боюсь, что небезопасно отправлять пароль, данные кредитной карты, ... во внешний интерфейс.

Теперь мой вопрос, должен ли я просто вернуть весь пользовательский объект и отправить его во внешний интерфейс, или будет третье решение, которое не всегда должно создавать новый объект?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Я бы сказал, что нет смысла отправлять исходный пользовательский объект во внешний интерфейс, потому что:

  • То, что вы не отправляете во внешний интерфейс, не может быть украдено или получено иным способом, например: вредоносные скрипты, выполняемые на стороне клиента (независимо от того, хэшированы они или нет)
  • Обычно вы не хотите отправлять ненужные данные, которые могут иметь значение, когда ваши пользователи используют медленное мобильное соединение с плохой мощностью сигнала и ваши объект будущего пользователя также включает в себя изображение профиля размером 4 МБ
  • . Возможно, вы захотите разделить внешний и внутренний интерфейсы, добавив дополнительный транспортный уровень, чтобы изменения во внутреннем интерфейсе не приводили к автоматическим изменениям во внешнем интерфейсе или Возможно, вы захотите объединить несколько вызовов к серверу в один большой транспортный объект, оба из которых требуют создания нового объекта в любом случае

Примечание: аналогично паролю, вы, вероятно, также не должны хранить номера кредитных карт в виде простого текста.

0 голосов
/ 27 февраля 2020

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

  1. Разработчики могут иметь доступ к паролям пользователей.
  2. Если данные украдены, пароли можно легко прочитать.

Пароли должны быть хешированы перед хранением, и хэши должны сравниваться. Не должно быть возможности восстановить его с ха sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...