Web 应用程序的框架通常可以在生产模式或开发模式下运行。两种模式之间的主要区别之一是如何处理异常:在开发模式下,通常会向浏览器发送带有堆栈跟踪的详细异常信息,而生产模式只会提供一个通用的(尽管可定制的)错误页面,该页面没有的任何更详细的信息。
出于这个原因,框架的文档通常也会警告不要在生产中使用开发模式;这是 .NET Core 的一个示例:
警告仅当应用程序在开发环境中运行时才启用开发者异常页面。当应用程序在生产中运行时,您不希望公开共享详细的异常信息。
DEBUG切勿在打开的情况下将站点部署到生产环境中。调试模式的主要功能之一是显示详细的错误页面。
DEBUG如果您的应用在is时引发异常True,Django 将显示详细的回溯,包括很多关于您的环境的元数据,例如所有当前定义的 Django 设置(来自settings.py)。
我无法理解上述安全措施背后的原因?
如果我理解,推理是这样的:详细的错误页面将允许潜在的攻击者发现有关应用程序源代码的详细信息 = 他们可能会发现弱点 = 不好。这不是通过默默无闻来定义安全吗?
另外:如果应用是开源的,这些措施有什么用?禁用详细的异常页面应该是为了防止攻击者找到有关其源代码的详细信息,但这些 - 按照设计- 存在于公共 GitHub 存储库中。似乎在这种情况下,我还不如在开发模式下运行应用程序,至少如果用户发现有意外错误,他们将能够给我更详细的信息,这可能有助于我修复这个错误?
如果我上面引用的文档警告背后的推理是正确的,那么这对我来说意味着开发开源 webapps 本身就是一个安全漏洞!因为如果允许攻击者找到源代码的一些细节是一件大事,那么简单地将源代码提供给任何感兴趣的人该有多糟糕!然而,AFAIK,开源并不被认为是一种无效且本质上不安全的模型。
我在这里想念什么?为什么要禁用详细的异常页面?