【发布时间】:2018-07-03 20:11:12
【问题描述】:
在 C# 中,编译器可以通过从调试模式切换到发布模式来去除断言。从安全(和用户体验)的角度来看,这是一件好事,可以避免将堆栈跟踪暴露给最终用户as a stacktrace may lower user-confidence in the stability of the app, and a stacktrace could expose vulnerabilities which can be exploited。此外,堆栈跟踪可以提供一些信息,帮助黑客对软件进行逆向工程。
查看Java 断言后,似乎不存在这样的能力。也就是说,断言保留在编译后的字节码中,Java 编译器没有命令行选项可以将其删除。相反,我们看到了Java runtime permits the enabling of assertions,恶意用户可能会尝试收集堆栈跟踪信息。此外,我什至看到一些encourage the idea that assertions should fail dramatically 吐出AssertionError 和堆栈跟踪。或者简单地说,人们忽略了让应用程序像这样失败的安全方面。
我的初步评估是Java 中的断言会带来安全风险,即使它们有利于调试或维护。
我们是否应该避免在 Java 中为安全关键型应用程序使用断言?或者如果有一个适当且安全的方式包含断言,应该怎么做?
为清晰而编辑: 我在这里假设 Java 应用程序作为桌面应用程序部署给最终用户。即,用户下载/安装应用程序。话虽如此,据我了解,用户能够运行可执行 jar,同时启用具有以下效果的断言:
java -ea -jar "MyJar.jar"
【问题讨论】:
-
AssertionError可以(并且应该)优雅地处理,并且不允许传播给用户。您的链接答案对于一般代码仍然有效,但仍应有全局错误处理程序来确保正确记录错误。
标签: java security desktop-application stack-trace assert