当前位置: 首页 > 面试题库 >

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

岳泳
2023-03-14
问题内容

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

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
   }
}

之所以这样做,是因为我必须检查用户是否对每个允许访问Web服务的请求都有一个活动帐户。这将使我避免对每个请求进行一次对数据库层的SQL调用(此刻正在强调)。我的问题是在生产中存储这样的数据有多安全?

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


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

就是说,对于高流量的Web服务,缓存凭据听起来像是一个明智的主意,但这并不是完全无关紧要的。

编辑:不,Web容器不同步线程。并发请求将由并发线程处理,并且如果这些请求恰巧读写相同的数据,则可能导致数据争用。例如,一个线程可以在用新信息更新帐户列表时读取帐户列表,从而看到不完整的列表。



 类似资料:
  • 我正在开发一个视频流应用程序,我注意到我的应用程序的带宽非常高。我正在使用免费spark计划,我已经达到了5个视频的免费计划的极限。 我正在我的应用程序中流式传输视频,它们不超过10mb并上传到我的Firebase存储中。我正在将Firebase存储链接保存在我的实时数据库中,以使其可在应用程序中播放。 我想知道我是否做错了什么,5个视频小于10mb,我在大约1小时内消耗了300mb的带宽。对于正

  • 问题内容: Linux内核: 4.10.0-20(通用)(也在4.11.3上尝试过) Ubuntu的: 17.04 我一直在尝试使用收集内存访问的统计信息。我能够 收集内存存储的统计信息,但内存负载的计数返回0值 。 以下是内存存储的详细信息: 对于内存负载,我 得到一个0计数 ,如下所示:- 我不明白为什么这算不上正确。 我是否应该以任何方式使用其他事件来获取正确的数据 ? 问题答案: 我已使用

  • 允许访问简单的加密和解密字符串,以便存储在本地机器上。 进程:主进程 此模块保护磁盘上存储的数据不被其他应用程序或拥有完全磁盘访问权的用户访问。 请注意,在Mac上,需要访问系统Keychain,这些调用可以阻止当前线程来收集用户输入。 如果密码管理工具可用,Linux 亦是如此。 方法 safeStorage 模块包含以下方法: safeStorage.isEncryptionAvailable

  • 我已经实现了一个小用例来评估Spring Data Neo4j。我有一个接口,它扩展了GraphRepository。 界面是这样的: 这给了我错误< code >“类型PublicRepository的层次结构不一致”。 这种类型的错误是因为当前类扩展/实现的类/接口之一不存在,而当前类又在扩展/实现另一个类/接口。 查看核心库的包我发现库中没有扩展为CRUDRepository的接口。我在Ne

  • 调用clear方法时,内存似乎减少了。然而,从其他答案来看,似乎< code>clear方法从未收缩过< code>HashMap。那么为什么内存会减少呢?

  • 内存安全 Rust推崇安全与速度至上,它没有垃圾回收机制,却成功实现了内存安全 (memory safety)。 所有权 在Rust中,所有权 (ownership) 系统是零成本抽象 (zero-cost abstraction) 的一个主要例子。 对所有权的分析是在编译阶段就完成的,并不带来任何运行时成本 (run-time cost)。 默认情况下,Rust是在栈 (stack) 上分配内存