我有一个记录异常strack跟踪的应用程序,我希望在生产中部署时,这些堆栈跟踪包括文件名和行号.我知道了如何部署带有程序集的调试符号,但在研究这个问题的过程中,我运行了accross this question,这意味着在生产环境中包含pdb文件不是一个好主意.一个 comments 的回答是:"调试信息可以提供敏感数据,并成为攻击向量.取决于应用程序是什么."

那么什么样的敏感数据可能会被曝光呢?如何使用调试符号危害应用程序?我对技术细节很好奇,但我真正想要的是一种实用的方法来判断为任何给定的应用程序和生产环境包含调试符号的风险.或者换一种说法:最坏的情况会是什么?

EDIT:后续问题/澄清

因此,根据目前为止每个人的答案,这个问题似乎可以简化一点.NET应用程序.Michael Maddox's answerJohn Robbins blog个链接中的这一部分突然向我跳了出来:

一个.NET PDB仅包含两部分 信息、源文件名和 它们的线条和局部变量 名字.所有其他信息都是 已在.NET元数据中,因此存在 不需要复制相同的 PDB文件中的信息.

对我来说,这重申了其他人关于Reflector的说法,言下之意是真正的问题是对程序集的访问.一旦确定了这一点,关于PDB要做的唯一决定就是您是否关心公开文件名、行号和局部变量名(假设您一开始就没有向最终用户显示堆栈跟踪).或者我是不是过于简单化了?

推荐答案

下面是另一个问题:

Are there any security issues leaving the PDB debug files on the live servers?

有关PDB文件的更多信息:

PDB Files: What Every Developer Must Know

通常,我总是在我的部署中包含PDB文件,yield 太大了,不容忽视.

如果您从不向用户公开堆栈跟踪(通常不应该),那么部署PDB文件实际上不会有任何额外的安全风险.

当发生用户可见的堆栈跟踪时,用户可以看到完整的堆栈跟踪,包括您的文件名和文件行号.这可能会让他们对你的应用程序是如何架构的有一定的了解,这可能会在黑客入侵时对他们有所帮助.

更大的安全威胁大约是Reflector,当在您的DLL上使用它时,它们将允许他们查看您的源代码,无论有没有PDB文件.

.net相关问答推荐

Powershell机器令牌组

无法在Ubuntu 22.04.3上运行带有Rider 2023和DotNet-8.0的项目

信号量的多线程问题

在 C# 中,如何使用泛型的基类将泛型接口的所有实例注入到单个构造函数中?

单线程单元 - 无法实例化 ActiveX 控件

将 BitmapImage 转换为 Bitmap,反之亦然

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

您是否使用 TestInitialize 或测试类构造函数来准备每个测试?为什么?

使用 IIS Express 托管网站(临时)

Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射

C#:内存不足异常

序列化私有成员数据

读取方法的属性值

什么版本的 .NET 附带什么版本的 Windows?

如何在可取消的异步/等待中处理 TransactionScope?

SQLParameter 如何防止 SQL 注入?

形成两个列表并集的最简单方法

在不使用while循环的情况下找到最里面的异常?

如何隐藏 WPF ListView 的标题?

什么时候使用 Tuple 和 KeyValuePair 比较好?