在 ASP.NET MVC 应用程序中保存配置信息的最佳做法在哪里?
Where is the best practice for keeping config info in an ASP.NET MVC application?
我想知道为以下 2 个问题保留与以下字段相关的配置信息的一般惯例:
A > 安全问题
B > 更新问题(如果配置应该由用户而不是开发人员更新)。
1) 我在web.config中定义了数据库连接字符串信息(数据库、用户和密码)。还有另一种方法,即保存在 cs 文件中吗?我认为不可能将它保存在应用程序使用的同一个数据库中。
2) 我的应用程序发送电子邮件,我在电子邮件的 *.cs class 中定义凭据。是真的吗?考虑到此信息已更改且没有开发人员支持,将它们保存在数据库中并允许用户通过应用程序更新它们是否是个好主意?
3) 所有场景(配置、更新和 *.cs 文件)的方法是什么?例如,当将电子邮件凭证保存在数据库中时,我是否应该在使用前从数据库中获取这些信息?或者是否有另一种方法,即将它写入一个临时文件,然后重用它,直到它在数据库中被更改,等等。)
如有任何帮助,我们将不胜感激。
在源代码中保留连接字符串和凭据等信息通常是一种不好的做法。而且它并不比将其存储在 Web.config(未加密)中更安全,因为所有
可以简单地从代码中提取资源。
对于 Web 应用程序,最佳做法是将所有敏感信息存储在一个地方(如 web.config),但在部署期间对其进行加密。
要加密 web.config
,您可以使用 aspnet_regiis
工具,可在此处找到
%windows%\Microsoft.NET\Framework\versionNumber
例如
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
键 -pef
或 -pe
。您可以只加密特定部分,例如 <connectionString>
,而其他部分不加密。
更多信息请见Encrypting and Decrypting Configuration Sections amd How to: Encrypt a web.config File
加密敏感的应用程序配置数据通常是个好主意。根据您的应用程序类型,您可以使用多种方法。
对于网络应用程序,您可以使用 DPAPI 和 aspnet_regiis 来加密配置。有关示例代码,请参阅 Encrypt and deploy app.config。
或者(如果您有桌面应用程序或不想要 aspnet_regiis),您可以查看受保护的配置部分,如下所述:https://msdn.microsoft.com/en-us/library/hh8x3tas.aspx
回答您的具体问题:
1) 保存在web.config中并加密。从安全角度来看,.cs 文件中的硬编码存在缺陷(代码可以反编译),并且随着代码从一个环境移动到另一个环境(dev -> uat -> prod),它会变得难以更改
2) 同样,不要将凭据存储在 .cs 文件中。您可以为用户提供一个 UI 来操作配置,但请记住,他们可能会破坏配置,您需要一种机制来恢复到已知的良好配置
3) 如果您担心从数据库中读取的频率(尽管只要没有写入,读取的成本很低),您可以在启动时将所有配置读入 class。这样就没有需要管理的临时文件,并且数据库上的读取量是有限的。
我想知道为以下 2 个问题保留与以下字段相关的配置信息的一般惯例:
A > 安全问题
B > 更新问题(如果配置应该由用户而不是开发人员更新)。
1) 我在web.config中定义了数据库连接字符串信息(数据库、用户和密码)。还有另一种方法,即保存在 cs 文件中吗?我认为不可能将它保存在应用程序使用的同一个数据库中。
2) 我的应用程序发送电子邮件,我在电子邮件的 *.cs class 中定义凭据。是真的吗?考虑到此信息已更改且没有开发人员支持,将它们保存在数据库中并允许用户通过应用程序更新它们是否是个好主意?
3) 所有场景(配置、更新和 *.cs 文件)的方法是什么?例如,当将电子邮件凭证保存在数据库中时,我是否应该在使用前从数据库中获取这些信息?或者是否有另一种方法,即将它写入一个临时文件,然后重用它,直到它在数据库中被更改,等等。)
如有任何帮助,我们将不胜感激。
在源代码中保留连接字符串和凭据等信息通常是一种不好的做法。而且它并不比将其存储在 Web.config(未加密)中更安全,因为所有 可以简单地从代码中提取资源。 对于 Web 应用程序,最佳做法是将所有敏感信息存储在一个地方(如 web.config),但在部署期间对其进行加密。
要加密 web.config
,您可以使用 aspnet_regiis
工具,可在此处找到
%windows%\Microsoft.NET\Framework\versionNumber
例如
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
键 -pef
或 -pe
。您可以只加密特定部分,例如 <connectionString>
,而其他部分不加密。
更多信息请见Encrypting and Decrypting Configuration Sections amd How to: Encrypt a web.config File
加密敏感的应用程序配置数据通常是个好主意。根据您的应用程序类型,您可以使用多种方法。
对于网络应用程序,您可以使用 DPAPI 和 aspnet_regiis 来加密配置。有关示例代码,请参阅 Encrypt and deploy app.config。
或者(如果您有桌面应用程序或不想要 aspnet_regiis),您可以查看受保护的配置部分,如下所述:https://msdn.microsoft.com/en-us/library/hh8x3tas.aspx
回答您的具体问题:
1) 保存在web.config中并加密。从安全角度来看,.cs 文件中的硬编码存在缺陷(代码可以反编译),并且随着代码从一个环境移动到另一个环境(dev -> uat -> prod),它会变得难以更改
2) 同样,不要将凭据存储在 .cs 文件中。您可以为用户提供一个 UI 来操作配置,但请记住,他们可能会破坏配置,您需要一种机制来恢复到已知的良好配置
3) 如果您担心从数据库中读取的频率(尽管只要没有写入,读取的成本很低),您可以在启动时将所有配置读入 class。这样就没有需要管理的临时文件,并且数据库上的读取量是有限的。