View Code
public class PasswordController : Controller { public ActionResult Change(string oldpwd, string newpwd, string newpwdConfirm) { string username = HttpContext.User.Identity.Name; ((newpwd == newpwdConfirm) && MyUsers.VerifyPassword(username, oldpwd)) DoPasswordChange(username, newpwd); // ... } public void DoPasswordChange(string username, string newpassword) { // 请求已经经过验证 User user = MyUsers.GetUser(username); user.SetPassword(newpassword); MyUsers.SaveUser(user); } }
这里将DoPasswordChange()标记为public,开了一个后门,局外人可以调用它来修改任何人的密码。
通常请求下,除非方法作为action方法否则没什么理由将Controller里面的方法设置为public。然而,如果我们想有一个不是action的public方法,可以使用[NonAction]特性,如:
[NonAction]
public void DoPasswordChange(string username, string newpassword) {...}
标记了【NonAction】的地方,MVC不会让它服务任何请求。
不要让模型绑定改变敏感的属性(Don’t Allow Model Binding to Change Sensitive Properties)
当模型绑定填充对象时,默认情况下会把值写到每一个请求对象的属性。例如,如果action方法接收一个Booking对象,Booking有一个int的属性DiscountPercent,那么恶意的访问者可能在URL后附加一个?DiscountPercent=100并获取一个便宜的假期。为了避免这种情况,可以使用[Bind]特性设置一个白名单限制模型绑定填充的属性。如下:
public ActionResult Edit([Bind(Include = "NumAdults, NumChildren")] Booking booking) {...}
同样也可以设置黑名单哈(Exclude),具体可以参考前面模型绑定的章节。
好了,本章的笔记到这里结束,关于web安全的话题我也不是很了解,非常希望路过的朋友能够留下你们见解。