代码之家  ›  专栏  ›  技术社区  ›  chiccodoro

如何安全配置数据库连接

  •  7
  • chiccodoro  · 技术社区  · 16 年前

    相似但不相同:

    现在我有一个问题:运行应用程序的用户不应该知道一般数据库用户的用户名/密码,因为我不希望他直接在数据库中搜索。

    我发现了三种可能性:

    1. 第一个提到的问题一般由 使文件仅对运行应用程序的用户可读 .

      但在我的例子中,这还不够(运行应用程序的用户是个人)。数据库用户/通行证是通用的,用户甚至不能访问。)

    2. 第一个答案是 在将连接数据写入文件之前对其进行加密 .

    3. 这个 第二参考问题

    我的问题是:

    1. 这是一个非常普遍的问题,所以没有任何一般的“如何做”的方式,不知何故一个“设计模式”?

    更新:

    作为对第一个答案的回应:有几个原因让我想直接连接到数据库 不使用web服务

    • 我们计划提供离线功能,即如果数据库或网络关闭,用户可以继续工作。为了解决这个问题,我正在考虑使用一个本地的进程内数据库,例如sqlservercompact,并在服务器数据库再次启动时使用mssync框架将其与服务器数据库同步。

    考虑到这一点,你还有什么进一步的想法吗?

    4 回复  |  直到 6 年前
        1
  •  3
  •   Jaguar    16 年前

    实际上,WebService方法(在其他一些答案中提到)意味着将NHibernate及其逻辑移动到web服务。然后,WebService使用WebService的方法公开应用程序可用的db功能。

    数据库实际上只有一个用户,即WebService使用的用户,如果您想让应用程序用户拥有不同的db权限,您可以从WebService层将其抽象出来

    最后,WinForms应用程序只知道通过WebService的方法请求数据的WebService的位置,您可以在这两个端点之间应用任何所需的安全措施。

    对于离线功能来说,它可以归结为一种安全的方法来将数据持久化到本地存储,并通过WebService提供一种同步方法

    实际上,我使用了一个与DB通信的Web服务和一个只与Web服务通信的WinForm应用程序(.NET Compact Framework),在没有蜂窝网络覆盖的情况下,它会序列化对存储卡的更改(数据并不重要,因此对于我的情况,在没有采取措施的情况下,会采取模糊/淫秽的安全措施)

    按要求用一个小例子更新(我确实觉得奇怪,尽管要求提供一个关于这个的例子)

    Foo (在Foo.asmx.cs中)以及 Bar 域类

    所以你得到了这个(实际的实现是不同的):

    namespace FWS
    {
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
        // [System.Web.Script.Services.ScriptService]
        public class FooService : WebService
        {
            private readonly ILog errorLogger = LogManager.GetLogger("ErrorRollingLogFileAppender");
            private readonly IDaoFactory daoFactory = new DaoFactory();
            private readonly ISession nhSession =  HibernateSessionManager.Instance.GetSession();
        }
    
        [WebMethod]
        public Bar[] GetFavoriteBars(string someParam, int? onceMore){
            return daoFactory.GetBarDao().GetFavoriteBars(someParam, onceMore); //returns a Bar[]
        }
    }
    

    我们将dao行为抽象出来,或者直接使用nhsession,作为webmethod公开。

    现在从WinForm应用程序开始,您需要做的就是 Add a WebReference 它对配置进行所有必要的更改,但也生成所有必要的类(在本例中,它将创建 酒吧 在web服务公开它时初始化)。

    namespace WinFormK
    {
        public class KForm(): System.Windows.Forms.Form
        {
            public void Do()
            {
                var service = new FWS.FooService();
                string filePath = "C:\\temp\FooData.xml";
                Bar[] fetched = service.GetFavoriteBars("yes!", null);
    
                //lets write this to local storage
                var frosties = new XmlSerializer(typeof(Bar));
                TextReader reader = new StreamReader(filePath);
    
                try
                {
                    var persisted = (T)frosties.Deserialize(reader);
                }
                catch(InvalidOperationException)
                {
                    //spock, do something
                }
                finally
                {
                    reader.Close();
                    reader.Dispose();
                }
            }
        }
    }
    

    有些事情你必须注意:

    • 实际上,您丢失了懒惰的东西,或者至少在winform应用程序中丢失了它。XML序列化程序无法序列化代理,因此您可以对这些集合/属性启用延迟获取,或者使用[XmlIgnore]属性,该属性反过来执行序列化时所暗示的操作。
    • IList<Bar> 必须转化为 List<Bar> 或者类似的
    • webservice由IIS执行,并且在web浏览器中可见。默认情况下,只提供本地浏览器请求(但这可以更改),因此您可以单独测试数据访问层和winform的功能。
    • 接收端(winformapp)对NHibernate一无所知。
    • 在上面的示例中,我为web方法保留了相同的dao方法名称;只要您没有在dao中保留nhibernate——特定的方法(比如 NHibernate.Criterions.Order 参数)您可能不会发现任何问题。事实上你可以有很多 .asmx Web服务中的类,甚至可能将它们“映射”到相应的dao(如 public class FooService : WebService public class BarService : WebService , public class CheService : WebService
    • 您可能需要在端点之间编写某种轮询方法来保持呈现的数据的新鲜。
    • WebService数据冗长;非常好。建议在通过电线发送之前先将其压缩或其他内容(也可以对其进行加密)
    • win应用程序只知道一个配置条目: http://server/FWS/FooService.asmx
    • 默认情况下,Web服务已禁用会话。请记住,在开始对用户数据使用会话之前。
    • 您可能需要为webservice编写某种身份验证
    • 在上面的例子中,我返回一个 Bar[] 具有 酒吧 WSBar 在那里它适应了原作 酒吧 类设置为webservice和winform应用程序可以使用的内容。这个类实际上只是一个数据载体。同样,这取决于与域类和nhibernate的集成程度,以及类的muxh复杂程度:某些数据结构在默认情况下无法序列化。

    • 此模型可能不适合您对应用程序所做的操作

        2
  •  5
  •   Matti Virkkunen    16 年前

    首先,让不受信任的用户连接到数据库通常不是一个好主意。很多事情都会出错。将web服务置于两者之间。

    如果你一定要这么做,那么即使他们得到了用户名和密码也不重要。限制他们在数据库中的权限,以便他们只能执行一些具有内置安全检查的存储过程。

        3
  •  1
  •   remi bourgarel    16 年前

    用户可以随时跟踪其网络流量并查看用户/密码(您可以使用编码,但我认为它仍然不能100%确定)。

    我认为应该在用户和数据库之间添加一个webservice,每个用户都有一个唯一的id。

        4
  •  1
  •   dotjoe    16 年前

    这就是为什么数据库桌面应用程序很糟糕。没有好的方法来切割它。最好的办法是使用存储过程或web服务。基本上,另一层可以被锁定并控制对数据库的访问。