如何保护ASP.NET MVC5应用程序?

时间:2018-12-04 07:39:12

标签: asp.net-mvc asp.net-mvc-5

 
<authentication mode="Forms"/>
 <forms loginUrl="~/Login/Login" defaultUrl="~/Login/Something" protection="All"></forms>
</authentication>   

一种方法是在每个Controller上添加Authorization标签,以保护应用程序免遭未授权用户的攻击。另一种方法是使用会话变量存储用户信息。因此,我的问题是从黑客的角度出发,我们如何保护应用程序免受黑客的攻击?保护应用程序安全的另一种方法?

1 个答案:

答案 0 :(得分:0)

注意:无论如何都不应该将此答案视为完整的答案,安全性总是很难的,如果对您来说很重要-请始终与第三方安全和渗透测试公司联系。这只是您应该考虑使MVC应用程序更安全(不一定安全)的几件事。

保护控制器

第一步是将[Authorize]应用于您的控制器,以确保在访问方法之前存在某种有效的身份验证。最好将Authorize添加到所有控制器,并使用[AllowAnonymous]设置例外,以使其默认安全。

授权用户

即使您已经向控制器添加了[Authorize],这仅意味着该用户已登录,而不意味着该用户应有权访问所访问的任何方法。第一步是通过为方法指定一组角色来扩展属性:[Authorize(Roles = "Administrator"]

根据应用程序的不同,您可能还必须检查当前用户是否属于公司/组或正在编辑的用户,以防止某人修改不属于他们的数据。

不要将数据泄漏到模型中

如果您将实际的数据模型用作视图模型,则有可能使用户输入的数据量超出预期。考虑以下示例:

class Employee {
    public int Id { get; set; }
    public string Name { get; set; }
    public int Salary { get; set; }
}

假设由于某种原因我们允许员工更改其姓名,并且为此我们使用Employee模型。但是当然,我们只为Name而不是Salary做一个编辑域,因为那样会很愚蠢:D。但是,由于模型绑定的工作原理,精明的Employee可以在更改其姓名时将<input type="text" name="Salary" value="2147483647">添加到表单中,而易变的db.Entry(employee).State = EntityState.Added;后跟db.SaveChanges()会将其工资更新为好吧。

解决方案?要么创建一个仅具有IdName属性的视图模型,以使其无法更改薪水,要么使用Bind属性仅包含我们允许的属性:{{1 }}。

XSS

一个非常重要的部分是保护用户免受不良动态内容的侵害。如果我可以输入显示给其他用户的HTML和Javascript,则可以滥用它们来窃取其身份验证令牌。避免将用户输入的数据呈现为HTML是防止这种情况的第一步。您还应该确保在表格中也始终使用防伪令牌。添加CSP标头是防止某人注入不应存在的脚本的好习惯。