Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何防止实体框架中的ID更改解释_Entity Framework_Security_Entity Framework Core - Fatal编程技术网

Entity framework 如何防止实体框架中的ID更改解释

Entity framework 如何防止实体框架中的ID更改解释,entity-framework,security,entity-framework-core,Entity Framework,Security,Entity Framework Core,在EntityFrameworkCore中保存实体时,Id当然会作为客户端update语句的一部分发布 在阅读一篇博客时,他们提到黑客可以简单地更改实体的Id,从而导致对不同实体的更新,可能是对不同用户的更新 有没有办法锁定这个 我能想到的唯一方法是获取服务器上的现有实体,然后确认它确实属于当前用户,然后再进行更新。这就是授权框架的作用。服务器端代码获取调用方的标识,并检查是否允许调用方执行该操作 如果您的业务规则规定只允许用户更新自己的实体,那么您的authZ将检查与经过身份验证的用户关联的i

在EntityFrameworkCore中保存实体时,Id当然会作为客户端update语句的一部分发布

在阅读一篇博客时,他们提到黑客可以简单地更改实体的Id,从而导致对不同实体的更新,可能是对不同用户的更新

有没有办法锁定这个


我能想到的唯一方法是获取服务器上的现有实体,然后确认它确实属于当前用户,然后再进行更新。

这就是授权框架的作用。服务器端代码获取调用方的标识,并检查是否允许调用方执行该操作

如果您的业务规则规定只允许用户更新自己的实体,那么您的authZ将检查与经过身份验证的用户关联的id是否与update语句中的id匹配


如果用户具有管理员权限,他/她很可能被允许更新任何实体。

另一个答案并不能真正解决问题,因为它允许有访问权限的人仍然恶意更改该编辑/更新事件允许范围之外的记录

安全方面是很好的实践,但是为了进一步保护,最好使用GUID主键,而不是1、2、3,然后使用时间戳字段进行并发检查

例如,假设我们有一个名为Person的模型,我们希望确保当这个模型更新时,它不仅过时(即有人击败了我们),而且我们还希望确保这是正确的记录,即并发性:假设这里是SQL server

public class Person{
    [Timestamp]
    public byte[] Timestamp { get; set; }
}
在我们创建的Fluent API模型中,我们将时间戳配置为rowversion标识符

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
        .Property(p => p.Timestamp)
        .IsRowVersion();
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.Property(p=>p.Timestamp)
.IsRowVersion();
}
加上GUID键,他们不仅要计算出正确的GUID,还必须获得正确的rowversion

现在,您不想做的是尝试并解决并发问题,正如各地建议的那样,因为基本上,您设法找到了另一个guid,并获得了成功,您现在不想开始将数据从一个安全源复制到另一个安全源。相反,您可以重定向到原始get(这将重新检查权限并重新加载(带有无法更新的消息),也可以简单地说它失败。无论哪种方式,您都希望避免说(做得好,这是对另一个GUID的一个很好的猜测,但时间戳是错误的)也就是说,在登录时,你不会说密码错误,你只会说登录失败

对于最终用户来说,这可能是一个后遗症,因为你没有为他们简化事情,你没有为他们处理并发性,也没有为他们匹配和排序所有数据。但是你必须记住用户更容易=坏用户更容易。就像跳上飞机不再容易一样,这并不是为了惹你生气关了,这是为了保护你的安全,这就是规则


值得考虑的是,数据本身就是一个实体,系统的安全性不应该是保护数据的唯一方式,密码很容易破解,散列密码很容易破解。人们的计算机很容易破解,然后进入系统。这只是其中的一部分,你应该保护数据,即使是在任何情况下您可能已经实现了d或管理员角色。

使用证书基础结构?您能解释一下吗?这是针对来自浏览器的数据的,所以我不知道如何做。我们检查用户是否有POST访问权限。我们使用viewmodels确保只能更改某些字段。然后我们从t获取实体并更新这些字段他查看模型。看到了吗?太棒了,非常感谢。我已经接受了这个答案。基本上,我将添加一个名为RowGuid的列,然后在其上添加ConcurrencyCheck属性。因此黑客必须猜测实体的Id,加上实体的Guid才能进行虚假更新。欢迎,是的,这也会起作用。震荡rrency工作得非常好它就像一行上的反伪造令牌。是的,如果你真的想让它变得更难,你可以将该行签出给签出表中的用户。即签出{id:'',userid:'',expires:'',然后签出它的签出,然后由该用户:-)