0

If I have a MySQL table that is not changed very often (once a month) which contains information such as active user accounts for a web service. How safe is it to do something like:

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

I would do this because I have to check a user has an active account for every request to allow access to the web service. This would allow me to avoid one SQL call to the database layer (which is stressed at the moment) on every request. My question is how safe is it to store data like this in production?

By the way, I would refresh the account list whenever a new user account is added via an API call. As stated above, this would happen about once to twice a month.

4

3 回答 3

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

也就是说,对于高流量的 web 服务,缓存凭证听起来是一个明智的想法,但它并非完全微不足道。

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

于 2013-03-13T20:57:20.853 回答
1

如果您有某种触发器来在相应的数据库表更改时更新内存中的对象,那么它应该是安全的。

如果没有触发器,它就会成为正确性问题,并且可能是策略问题。如果基础架构的不同部分具有不同的数据库内存版本,会发生什么情况?例如添加或删除用户与您的服务反映更改之间的间隔是可接受的?

于 2013-03-13T20:36:10.543 回答
1

看看缓存。您的库可能已经支持它,如果不是 memcached 是一个不错的选择。

于 2013-03-13T20:36:30.823 回答