有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将整个对象发送到前端(包括密码)有意义吗?

我有以下数据库表:

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

在登录期间,我验证数据库上的电子邮件和密码,返回名称和用户ID

@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"

因此,我总是创建一个新对象,设置值并将该对象返回到UI

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

我也可以select u from User u,将结果强制转换到用户对象并发送到前端,但我担心发送密码、信用卡详细信息等是不安全的,。。。到前端

现在我的问题是,我应该简单地返回整个用户对象并将其发送到前端,还是有第三种解决方案不必总是创建新对象


共 (2) 个答案

  1. # 1 楼答案

    我认为将原始用户对象发送到前端是没有意义的,因为:

    • 未发送到前端的内容不能被窃取或以其他方式检索,例如客户端上运行的恶意脚本(无论是否经过哈希处理)
    • 您通常不想发送不必要的数据,当您的用户处于信号强度低的慢速移动连接上,并且您未来的用户对象还包括一张4MB的个人资料图片时,这可能很重要
    • 您可能希望通过添加一个额外的传输层来分离前端和后端,这样后端中的更改不会自动导致前端中的更改,或者您可能希望将对后端的多个调用合并到一个大的单个传输对象中,两者都需要创建一个新对象

    另一方面:与密码类似,您可能也不应该以明文形式存储信用卡号

  2. # 2 楼答案

    虽然在前端和后端之间发送密码是可以接受的,但它们之间的连接是安全的,而在数据库中以纯文本形式存储密码是不安全的。有几个原因:

    1. 开发者可以访问用户的密码
    2. 如果数据被盗,密码很容易读取

    在存储密码之前,应该对密码进行散列,并对散列进行比较。应该不可能从哈希中恢复它