将字符串转换为动态对象

Col*_*ech 10 c# dynamic

是否有一种直接的转换方式:

string str = "a=1,b=2,c=3";
Run Code Online (Sandbox Code Playgroud)

成:

dynamic d = new { a = 1, b = 2, c = 3 };
Run Code Online (Sandbox Code Playgroud)

我想我可能会编写一个函数来拆分字符串并循环结果以创建动态对象.我只是想知道是否有更优雅的方式来做到这一点.

Tam*_*eer 10

我想如果你将"="转换为":"并用大括号包装所有内容,你将得到一个有效的JSON字符串.

然后,您可以使用JSON.NET将其反序列化为动态对象:

dynamic d = JsonConvert.DeserializeObject<dynamic>(jsonString);
Run Code Online (Sandbox Code Playgroud)

你会得到你想要的.


Ale*_*ici 6

您可以使用Microsoft Roslyn(是一体化的NuGet包):

class Program
{
    static void Main(string[] args)
    {
        string str = "a=1,b=2,c=3,d=\"4=four\"";
        string script = String.Format("new {{ {0} }}",str);
        var engine = new ScriptEngine();
        dynamic d = engine.CreateSession().Execute(script);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想添加更复杂的类型:

string str = "a=1,b=2,c=3,d=\"4=four\",e=Guid.NewGuid()";
...
engine.AddReference(typeof(System.Guid).Assembly);
engine.ImportNamespace("System");
...
dynamic d = engine.CreateSession().Execute(script);
Run Code Online (Sandbox Code Playgroud)

根据您的评论中的问题,存在代码注入漏洞.添加System引用和命名空间,如上图所示,然后替换为str:

string str =
    @" a=1, oops = (new Func<int>(() => { 
                Console.WriteLine(
                    ""Security incident!!! User {0}\\{1} exposed "",
                    Environment.UserDomainName,
                    Environment.UserName); 
                return 1; 
            })).Invoke() ";
Run Code Online (Sandbox Code Playgroud)

  • 这非常有趣.我想知道它是否会打开代码注入漏洞?就像转义字符串并执行类似于sql注入的随机代码一样? (2认同)