所以我正在使用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!"
赞赏任何建议。
答案 0 :(得分:0)
您无法阻止修改私有数据的外部代码。但只要是你的代码,你就不会有任何问题,因为你不会做坏事。
如果您需要使用插件,可以对它们进行沙盒处理并拒绝反射权限。阅读How to deny reflection using ReflectionPermission了解更多信息