将 PDB 调试文件留在实时服务器上是否存在任何安全问题?

问题描述 投票:0回答:7

将 .NET PDB 文件保留在真实服务器上是否存在任何安全问题?

我知道抛出异常可能需要更长的时间,但是谁会在正常执行期间抛出异常呢? :-)

但是从安全角度来看呢?有什么问题吗?

.net asp.net security pdb-files
7个回答
22
投票

如果您的系统在使用 PDB 时不安全,那么如果没有它们,系统也可能不安全。显然,这取决于更好的错误报告对您的价值有多大。就我个人而言,我非常看重这一点,因此倾向于部署 PDB。


11
投票

我认为一个公平的论点是,将 PDB 留在实时服务器上是一种风险。在生产崩溃并且问题无法在开发或 UAT 上重现的情况下,诊断错误发生的位置会更加耗时(而且可能是不可能的)。

至少,与部署的 DLL 相匹配的 PDB 应该位于生产服务器上某处的 ZIP 文件中。如果您不在身边提供帮助,其他人应该很容易找到它们。

另请参阅 John Robbins 的 PDB 文件:每个开发人员必须了解的内容


7
投票

将 .PDB 文件发布到网站时可能遇到的唯一问题是发生异常,并且忘记在 web.config 中设置 CustomErrors 属性。堆栈跟踪将显示文件名和行号,这可能是一个安全问题。

我认为没有任何其他风险。


3
投票

如果服务器是 IIS,则不需要。如果将这些文件保存在正确的位置(网站中),则不会向公众公开。有时我会在 Web 服务器上找到中间(obj 目录)文件 - 这似乎是意外公开二进制文件的最喜欢的方式。在任何情况下,如果你的 pdb 可见,你的 dll 也可见,这更糟糕。

正如 activa 所指出的,堆栈跟踪对于有或没有行号的黑客来说非常有用。保密。

我假设您可能在真实服务器上运行的任何其他程序(服务等)根本无法公开访问。


2
投票

如果您向最终用户呈现失败的异常(也称为黄屏死机),则可能会带来攻击者更好地了解您的系统的风险。

可能的解决方案之一 - 制定异常处理政策

  1. 使用原始堆栈跟踪、附加信息和唯一的异常 ID (Guid) 记录所有异常。
  2. 用仅包含异常 ID(用于参考和反馈)和带有丢弃的堆栈跟踪信息的清理消息(即:无连接字符串)的包装器替换引发的异常。

.NET 中开源异常处理块的示例:


-4
投票

基本上 PDB 就在源代码下方,并且 ASP.NET/IIS 也不会阻止它们被下载。

现在人们肯定必须猜测程序集名称,这可能不太可能,但为什么要冒险呢?


-5
投票

嗯 - 对此我倾向于安全警告。我认为你应该有 PDB,但不要在生产服务器上。此外,您应该在任何实时系统上关闭“调试”。调试是令人讨厌的,当你不需要它时你就不想它。

来自斯科特格思里

  1. ASP.NET页面的编译需要更长的时间(因为禁用了一些批量优化)
  2. 代码执行速度可能较慢(因为启用了一些额外的调试路径)
  3. 应用程序在运行时使用更多内存
  4. 从 WebResources.axd 处理程序下载的脚本和图像不会被缓存

在您的 machine.config 中设置部署 Retail=true:

<configuration>
    <system.web>
          <deployment retail="true"/>
    </system.web>
</configuration>

这会覆盖调试、错误和跟踪设置,这将防止计算机本身之外的任何错误泄露。

既然您已关闭调试,没有错误或跟踪,为什么还要将 PDB 部署到生产服务器呢?将它们存储在其他地方,甚至可能是您的开发服务器。从开发到生产的代码升级脚本可以专门排除 PDB,但将它们存档,以便在您需要对生产进行调试时可用。

© www.soinside.com 2019 - 2024. All rights reserved.