gpt4 book ai didi

减少数据库负载的 Java 内存存储 - 安全吗?

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:58 25 4
gpt4 key购买 nike

如果我有一个不经常更改(每月一次)的 MySQL 表,其中包含诸如 Web 服务的 Activity 用户帐户等信息。做这样的事情有多安全:

public AccountDao
{
List<Account> accounts;
/*fields*/
public AccountDao()
{
refreshAccounts();
}

public void refreshAccounts()
{
this.accounts = /*call to database to get list of accounts*/
}

public boolean isActiveAccount(String accountId)
{
//logic involving in memory list object above
}
}

我会这样做,因为我必须检查用户是否有针对每个请求的 Activity 帐户,以允许访问 Web 服务。这将允许我避免在每次请求时对数据库层进行一次 SQL 调用(目前压力很大)。我的问题是在生产中存储这样的数据有多安全?

顺便说一句,每当通过 API 调用添加新用户帐户时,我都会刷新帐户列表。如上所述,这种情况大约每月发生一到两次。

最佳答案

  1. 需要以某种方式同步对 DAO(及其潜在调用者)中的共享状态的访问,以实现线程安全。
  2. 过时的数据会导致错误的访问决策。由于这可能与安全相关,因此您的代码需要防弹;特别是,它需要在发生故障时可靠地工作。这会使任何基于通知的方案变得不稳定 - 如果通知丢失怎么办?
  3. 凭据在内存中的生命周期得到延长。 secret 性仍然可以通过散列凭据来实现(坦率地说,如果有人可以读取您的应用程序的内存,那么您还有很多其他问题)。在内存中操纵密码需要攻击者有权访问堆内存,如果他可以访问,那么无论如何你都输了,因为他可以很容易地更改用于读取帐户的数据库连接。

也就是说,对于高流量的网络服务,缓存凭据听起来是个明智的想法,但这并非完全无关紧要。

编辑:不,网络容器不同步线程。并发请求将由并发线程提供服务,如果这些线程碰巧读取和写入相同的数据,就会导致数据竞争。例如,一个线程在用新信息更新时可能会读取帐户列表,因此会看到一个不完整的列表。

关于减少数据库负载的 Java 内存存储 - 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com