编译器创建的匿名类型:可破解行为



我有一些客户端HTTP RESTfull代码,这取决于.net编译器生成的匿名类型提供的舒适性。

匿名类型 示例0 :

string prop_1 = "strValue1"; int prop_2 = 5;new { prop1 = prop_1, prop2 = prop_2};

匿名类型示例 1 :

new { prop1 = "strValue1", prop2 = 5};

匿名类型 示例 2(也有效(:

string prop1 = "strValue1"; int prop2 = 5;new { prop1, prop2};

这里的问题是,编译器生成的匿名类型的属性的名称通常很重要,不能重命名。具体而言,如果用户主动为匿名类型声明了属性名称,则可能指示该名称实际上很重要 - 即使在程序集之外 -

Dotfuscator 社区目前默认重命名匿名类型的属性。

其中一个有问题的领域是用于序列化和网络传输的 JSON 对象的"临时"构建。请参阅下面的代码。

这是一些代码,我在其中手动组装用于 WebAPI 查询的 HTTP 消息内容。请求的正确性取决于确切的属性名称。匿名类型用于不必为每种类型的 HTTP WebAPI 查询声明新的 - new again--类型。用户名、密码和request_token的名称在应用程序外部很重要(对于 API 服务器(

string baseUrl = BASE_Address + BASE_Path + VALIDATE_REQUEST_TOKEN_W_LOGIN_Path;
var query = new Dictionary<string, string>();
query.Add(API_KEY_Key, _settings.ApiKey);
string requestUri = QueryHelpers.AddQueryString(baseUrl, query);
var jsonObj = new { username = username, password = password, request_token = requestToken };
string json = JsonConvert.SerializeObject(jsonObj);
var content = new StringContent(json, encoding: Encoding.UTF8, mediaType: "application/json");

预期行为: 如果 Dotfuscator 无法确定重命名匿名属性是安全的,则不应重命名它。

考虑:

  1. 如果用户主动命名了匿名类型属性,则该属性一定是可疑的。请注意,使用 example0 而不是较短的 example2(见上文(的唯一原因是为了防止在 Visual Studio 中进行类型重命名。使用 example0 即使您将变量重命名为 prop_1 或 prop_2,它也不会破坏匿名类型名,从而破坏生成的 Json 对象

  2. 如果该方法或任何调用的子方法使用序列化,则重命名属性肯定会破坏代码。(因为序列化 JSON 中的类型名将取决于原始属性名称,因为序列化命名没有用户声明的属性(

现在的问题是:您能否向我推荐一些属性或技巧,以保留我当前的代码,但确保 Dotfuscator 不会重命名方法/匿名类型中的任何内容?

注意:我在这里以我作为 Dotfuscator 开发人员员工的专业身份回答

自 5.34 版以来,Dotfuscator 社区包含一个默认引用规则,用于从生成的匿名类型中排除属性。(您可以从这里下载最新版本的Dotfuscator Community(。或者,您可以手动定义规则,即:

从名为.*AnonymousType.*的类型中排除包含自定义属性的所有属性System.Runtime.CompilerServices.CompilerGeneratedAttribute

<type name=".*AnonymousType.*" regex="true" excludetype="false">
<customattribute name="System.Runtime.CompilerServices.CompilerGeneratedAttribute" regex="true" />
<propertymember name="*" regex="true" />
</type>

相关内容

  • 没有找到相关文章

最新更新