<authentication mode="Forms"/>
<forms loginUrl="~/Login/Login" defaultUrl="~/Login/Something" protection="All"></forms>
</authentication>
一种方法是在每个Controller上添加Authorization标签,以保护应用程序免遭未授权用户的攻击。另一种方法是使用会话变量存储用户信息。因此,我的问题是从黑客的角度出发,我们如何保护应用程序免受黑客的攻击?保护应用程序安全的另一种方法?
答案 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()
会将其工资更新为好吧。
解决方案?要么创建一个仅具有Id
和Name
属性的视图模型,以使其无法更改薪水,要么使用Bind
属性仅包含我们允许的属性:{{1 }}。
一个非常重要的部分是保护用户免受不良动态内容的侵害。如果我可以输入显示给其他用户的HTML和Javascript,则可以滥用它们来窃取其身份验证令牌。避免将用户输入的数据呈现为HTML是防止这种情况的第一步。您还应该确保在表格中也始终使用防伪令牌。添加CSP标头是防止某人注入不应存在的脚本的好习惯。