预处理器指令是不是保护服务器代码不受客户端影响?

Posted

技术标签:

【中文标题】预处理器指令是不是保护服务器代码不受客户端影响?【英文标题】:Do pre-processor directives protect server code from the client?预处理器指令是否保护服务器代码不受客户端影响? 【发布时间】:2017-02-10 21:46:29 【问题描述】:

我正在开发一个客户端-服务器库。某些类可以由客户端或服务器使用,但执行方式不同,并且每个类产生的结果略有不同。同样,服务器代码可能包含不会从客户端构建中调用的其他方法。

一个类可能如下所示:

public class StuffDoer 

    public void DoStuff(object msg)
    
        ServerDoStuff(msg);
        ClientDoStuff(msg);
    

    [Conditional("SERVER")]
    private void ServerDoStuff(object msg) 
    
        // Do secret server stuff...
    

    [Conditional("CLIENT")]
    private void ClientDoStuff(object msg)
    
        // Do client sutff...
    

    [Conditional("SERVER")]
    public void DoCoolStuff(object msg)
    
        // server does cool stuff...
    


我读过 Conditional 属性仍然编译代码,因此会在构建中,不像预处理器指令会完全删除代码甚至不编译它。

我担心不诚实的客户可能会通过不混淆源代码并弄清楚服务器的工作原理来破解产品。

我的担心是没有根据的还是我需要放置预处理器指令来隐藏源代码?

【问题讨论】:

如果我必须在两者之间进行选择,我的选择是预处理器指令。 ConditionalAttribute 不会隐藏类的“内部结构”,因为服务器特定代码仍将编译为 MSIL(仅删除对方法的调用)。此外,ConditionalAttribute 在应用它的位置和方式方面非常有限:仅返回从Attribute 派生的无效方法和类 【参考方案1】:

根据documentation:

将 ConditionalAttribute 应用于方法向编译器表明 不应将对该方法的调用编译到 Microsoft 中间语言 (MSIL) 除非条件编译符号 与 ConditionalAttribute 关联的定义。

当您使用定义的 CLIENT 进行编译时,调用标有 SERVER 的方法的代码将不会出现在最终程序集中。但是该方法的代码将出现。你无法通过这种方式实现你所需要的。

【讨论】:

我不确定它是怎么说的。它表示对标有条件属性的方法的任何 调用 都不会被编译,但方法本身会被编译,这是 OP 试图避免的。 @InBetween 你是对的,我已经编辑了答案【参考方案2】:

当“SERVER”未定义时,标记为“SERVER”的方法将始终编译为最终程序集,但所有对该方法的调用都将被删除。

This is code

This is decompiled result

【讨论】:

以上是关于预处理器指令是不是保护服务器代码不受客户端影响?的主要内容,如果未能解决你的问题,请参考以下文章

保护/清理不受信任的客户端对服务器的远程调用

C#预处理器指令

如果指令不存在于 c# 中,我的预处理器指令中的代码是不是包含在编译代码中?

C 预处理器指令是不是每次都重新计算?

预处理器的相关知识:

如何保护我的应用程序的一部分不受某些用户的影响(即,其中一个选项卡式视图只能由某些用户看到)