防止外部代码修改C#中的私有数据

时间:2013-12-09 09:58:29

标签: c# asp.net-mvc asp.net-mvc-4 reflection

所以我正在使用mvc4和Razor中的webfrom项目,我需要在会话中存储帐户信息,而允许Account Manager Module修改它们。我写了一个尝试实现它的类。

我的代码

public static class AccountProvider
{
    public static bool Login(this HttpContextBase ctx
        , string userName, string password)
    {
        var account = new AccountBase{UserName = userName};
        ctx.Session["Account"] = account;
        return true;
    }

    public static string GetName(this HttpContextBase ctx)
    {
        var account = ctx.Session["Account"] as AccountBase;
        return account.UserName;
    }

    private class AccountBase
    {
        public string UserName { get; set; }
    }
}

我可以用这个登录:

HttpContext.Login("Admin","1234567");

然后在视图上显示帐户信息:

Hello @(Context.GetName())!

看起来非常简单,外部代码无法修改会话中的帐户信息,除了使用 Reflection

我可以在视图页面中轻松使用以下代码来更改帐户信息

Hello @(Context.GetName())! //print "Hello Admin!"
@{
    var account = Session["Account"];
    var type = account.GetType();
    var item = Activator.CreateInstance(type);
    var p = type.GetProperty("UserName");
    p.SetValue(item, "aaaaa");
    Session["Account"] = item;
}
Hello @(Context.GetName())! // print "Hello aaaaa!"
  • 有没有办法真正阻止外部代码修改mvc c中的私有数据?
  • 如何更安全地存储安全信息(如帐户信息)?

赞赏任何建议。

1 个答案:

答案 0 :(得分:0)

您无法阻止修改私有数据的外部代码。但只要是你的代码,你就不会有任何问题,因为你不会做坏事。

如果您需要使用插件,可以对它们进行沙盒处理并拒绝反射权限。阅读How to deny reflection using ReflectionPermission了解更多信息