【问题标题】:Security of cached data in .NET.NET 中缓存数据的安全性
【发布时间】:2012-01-02 20:18:30
【问题描述】:

我缓存了一个通过 C# ASP .NET 4.0 Web App [大约 50000 行 32 列] 从 SQL Server 2005 获取的 DataTable。

平均缓存在客户端

我想知道 Cache 中的 DataTable 是安全的还是不安全的?

如果比不安全

  1. 如何直接从缓存中获取该数据并查看 [不是由我的 Web 应用程序作为非开发人员查看]
  2. 如何保护数据。

【问题讨论】:

  • 好吧,你用的是什么缓存?你是说 HttpContext.Cache 吗?
  • 不,我使用了 Cache.Insert() 和 Library : System.Web.Caching;
  • HttpContext.Cache is System.Web.Caching.Cache... 这是服务器端,而不是客户端
  • 所以它把数据存储在服务器缓存上,你的意思是说?
  • 附加说明:使用带有缓存的 DataTable 时应格外小心。由于 ASP.NET 是多线程的,并且缓存是活动对象,因此您可以让多个线程同时与同一个 DataTable 通信。如果你只是阅读,那很好。但是,如果您要更改表(添加/删除/更新行等),那么您必须同步(即锁定)数据,否则你破坏它。

标签: c# caching datatable asp.net-4.0


【解决方案1】:

数据与服务器和 Web 应用程序一样安全。

如果有人对盒子有物理访问权(或通过 RDP),他们总是可以导致内存转储并直接从内存中读取值。

根据其编写方式,应用程序可能会公开完整的缓存。

如果不考虑其中任何一个,您可以认为缓存是安全的。


更新:

看到您在谈论客户端 - 客户端的没有可以被认为是完全安全的。客户端可以物理访问他们的机器,因此可以进行内存转储和任意数量的其他技巧(包括直接内存检查)。

如果客户端不需要所有数据,则只共享所需的最低限度。不要坚持下去。

【讨论】:

  • @nirav.patel 客户端的缓存是怎样的?如果是这样,这是一个 asp.net 问题吗?
  • 是的,当然,我通过 ASP 将数据保存在 DataTable 中。网络应用程序。并且它工作得很好......我已经完成了测试。我只是想知道用户是否可以以任何方式查看该数据?
  • @nirav.patel - 好吧,如果它在 ASP.NET 应用程序中,它驻留在 服务器中。您能解释一下缓存在客户端中的含义吗?
  • @nirav 那么正如 Oded 和我自己已经回答的那样:不会影响您的服务器。
  • 我想我做错了。请参阅我在 ASP 中使用 System.Web.Caching.Cache。网。 1. 在页面加载事件中,我将数据存储在缓存中。 2.然后我关闭禁用网络连接。 3.在按钮上单击我从缓存中获取数据。它有效....甚至没有连接到服务器。
【解决方案2】:

如果您指的是 HttpContext.Cache,那么该数据在内存中并且对于您的应用程序来说是本地的。除非您有意提供 API 来执行此操作,否则您的网络服务器已被入侵,否则无法从您的应用程序外部任意查询它。

如果您的网络服务器遭到入侵,黑客拥有管理员访问权限,他们可以访问进程内存,因此您的数据可用。但是,此时黑客可能可以访问您的连接字符串等,并且可以更有趣来攻击您的数据库(比查看进程内存更软的目标)。

【讨论】:

  • 缓存在客户端。用户的本地机器缓存。
  • @nirav.patel 让我直截了当地说:不,它不是
【解决方案3】:

您可以利用 DPAPI(数据保护 API),例如使用 ProtectedMemory Class

.

using System;
using System.Security.Cryptography;

public class MemoryProtectionSample
{

    public static void Main()
    {
// Create the original data to be encrypted (The data length should be a multiple of 16).

        byte [] secret = { 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4 };

// Encrypt the data in memory. The result is stored in the same same array as the original data.
        ProtectedMemory.Protect( secret, MemoryProtectionScope.SameLogon );

// Decrypt the data in memory and store in the original array.
        ProtectedMemory.Unprotect( secret, MemoryProtectionScope.SameLogon );
    }

}

【讨论】:

  • 不断地加密和解密对于缓存来说并不是必要方便的,特别是因为它通常是多线程的。这也对 OP 的DataTable 没有帮助。
  • @MarcGravell:我没有具体说明应该多久保护一次内存。另外,你有更好的策略吗?
  • 如果您阅读了有关该问题的评论线程和 my/Oded 的回答,很明显该问题与保护进程内存无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2018-04-21
  • 2018-10-16
  • 2017-09-18
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多