在工作中正在进行安全性讨论,以确定是否可以达到以下部署的代码或“#34;悬挂式”"进入...即使它是在RELEASE模式下构建的。
思想?
修改
我做"看"它在DotPeek中 - 即使在Release版本中构建。
然而,该文件是"灰显"
这是否意味着它不会执行?
DotPeek仅仅#34;反编译"代码......它没有显示内置模式中存在哪些代码......对吗?
代码看起来像:
using System;
using System.ServiceProcess;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
#if DEBUG
var myservice = new StpListener();
myservice.OnDebug();
//KEEP the service alive
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#else
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new StpListener()
};
ServiceBase.Run(ServicesToRun);
#endif
}
}
答案 0 :(得分:5)
答案 1 :(得分:5)
它是编译时功能。一旦编译器完成了它的工作,你 在#if
和#else
之间。
你永远不会(只要你留下这些项目)产生一个包含两组代码的二进制文件。
答案 2 :(得分:2)
假设您正在使用Roslyn
编译器(尽管所有C#兼容编译器都有可能),#if DEBUG
代码甚至不会被编译到IL
中,所以它绝对不能被访问。
但是,如果您使用Conditional("DEBUG")
,代码将使其成为IL并且只是对它的调用将被删除,因此可能这可能是一个安全漏洞。
答案 3 :(得分:1)
This Resource应该有助于进一步解释,但预编译器命令在编译时进行评估。单独使用它们不会暴露安全漏洞,但这并不意味着它们评估的条件不会成为问题。 #If DEBUG
比if(Debugger.IsAttached)
更安全。你只是不想让你的#If
响应运行时条件(无论如何都需要做一些事情)。