Database 在web应用程序中的何处存储数据库凭据?

Database 在web应用程序中的何处存储数据库凭据?,database,security,web-applications,credentials,Database,Security,Web Applications,Credentials,我想知道您使用什么技术来存储应用程序的数据库凭据。我特别关注java Web应用程序,但我认为没有必要将问题局限于此 需要考虑的事项: 是否使用属性文件、xml配置或其他? 它是捆绑到您的应用程序中(即在jar文件中)还是单独存储在文件系统的某个地方? 密码加密了吗?如果是,您使用什么加密方案 对于Java,数据库连接池应该通过容器传递到WebApp中。这在WEB-INF/WEB.xml中作为参考资料声明的标准中。这同样适用于邮件会话和其他外部资源,这些资源可能因安装而异。请查阅JNDI以了解更

我想知道您使用什么技术来存储应用程序的数据库凭据。我特别关注java Web应用程序,但我认为没有必要将问题局限于此

需要考虑的事项:
是否使用属性文件、xml配置或其他?
它是捆绑到您的应用程序中(即在jar文件中)还是单独存储在文件系统的某个地方?

密码加密了吗?如果是,您使用什么加密方案

对于Java,数据库连接池应该通过容器传递到WebApp中。这在WEB-INF/WEB.xml中作为参考资料声明的标准中。这同样适用于邮件会话和其他外部资源,这些资源可能因安装而异。请查阅JNDI以了解更多有关这方面的信息)

这样做的好处在于,应用程序并不关心如何实际连接到外部的任何东西。它不会看到任何密码,因为容器本身将使用它们

在tomcat中,可以从conf/Catalina/localhost/、conf/server.xml中的上下文文件(例如)进行配置,也可以从webapps META-INF/context.xml进行配置,最好仅用于开发环境。其他环境有自己的配置位置或应用程序


密码的加密实际上取决于容器。Tomcat以明文形式存储它们,但应用程序本身不会看到它。我不知道其他环境中的机制。

取决于应用服务器

我通常使用JNDI查找数据源,因此凭据存储在处理连接池的应用程序服务器上。不需要以这种方式在配置中放置除JNDI名称以外的任何内容

是的,密码在WebLogic上加密


在Tomcat上,事情可能是危险的。连接信息在META-INF/context.xml中,这意味着密码为纯文本。我只为开发而这样做,从不在生产中这样做。

因为您将这个问题留给平台来解决,所以我将添加.NET应用程序的数据库凭据存储在web.config文件中。从版本2.0和更高版本开始,有一个特定的ConnectionString部分,允许对连接字符串进行更轻松的编程访问


默认情况下,除了让IIS自动阻止对web.config文件的直接请求外,还可以使用IIS命令加密web.config文件的ConnectionString部分。这种加密是特定于机器的,增加了它的优势,当您访问连接字符串时,.NET运行时也会动态解密连接字符串,因此不需要在应用程序中进行额外的编码来使用它。

在Microsoft堆栈上,事情可能会非常好

您在Active Directory中创建了一个几乎没有权限的网络用户帐户。您将IIS配置为以该用户的身份运行您的webapp。您授予该用户对磁盘上的web文件夹和文件的读取权限。您可以将SQL Server配置为授予该用户对所需表的读/写权限。在连接字符串中,您指示db客户端作为webapp当前运行的用户帐户进行连接


只有一个实际用户帐户,尽管它在多个位置可见。此用户帐户的权限非常有限。没有存储密码的任何地方,即使加密。无需在代码中进行任何配置即可使其正常工作(全部在设置权限中)。

在Django中,凭据位于
设置.py
配置文件中。由于这通常不会保存在
/var/www/
目录树中,因此非常安全

此外,一个Django应用程序可以用于(和重用)同一主机上的多个网站或web服务器,每个网站或服务器都有自己不同的设置。因此,
settings.py
配置不是与应用程序捆绑在一起的,而是应用程序单个部署的一部分。

对于asp.net:

我在注册表中存储全局参数,例如连接字符串和存储库路径,然后在web.config中存储对注册表项的引用


主要原因是我经常发现我必须编写一个独立的可执行文件来运行后台任务和其他需要访问相同参数的自动化功能。因此,将所有真正全球化的东西放在一个容易访问的地方可以让生活更轻松。

哪些地方是保存web应用数据库凭据的好地方? 在源代码中的单独文件中 在web服务器主机上的单独文件中 在数据库中
没有一个决不能存储数据库凭据

如前所述,不指定平台,并使用以前答案中的一些想法:


我正在考虑集装箱申请。您可以将数据库的密码存储在容器中的文件中。应用程序的第一步是建立数据库连接,甚至在侦听web请求之前。成功的db连接将删除具有凭据的文件,并删除包含这些凭据的变量。因此,当您开始服务请求时,唯一剩下的就是从现在开始使用的开放数据库句柄。如果由于任何原因数据库连接丢失,您只需退出并等待重新启动容器,凭据文件就会再次出现。

那么,如果服务器上没有具有凭据的文件,您的应用程序究竟如何连接到数据库?