问题
我只是想弄清楚在 Breeze 中保存更改时我需要在服务器端实现多少安全性。特别是,我正在考虑恶意用户如何手动破解 SaveChanges 请求,或破解客户端中的 javascript,以绕过我的正常业务规则 - 例如,恶意更改我的实体上的外键 ID。
我想准确了解我需要将安全工作重点放在哪里;我不想浪费时间来实现不需要的安全层。
我在服务器端使用 Breeze 与 .net 和实体框架。
Example
这是一个简单的例子。ObjectA
有一个参考ObjectB
, and ObjectA
属于特定的User
。所以,我的数据库如下所示:
ObjectA:
Id ObjectB_Id SomeField User_Id
1 1 Alice's ObjectA 1
2 2 Bob's ObjectA 2
ObjectB:
Id SomeOtherField
1 Foo
2 Bar
User:
Id Name
1 Alice
2 Bob
从这个模型来看,我的安全问题是:
- 我不希望未经身份验证的用户更改任何数据
- 我不希望鲍勃能够对爱丽丝的进行任何更改
ObjectA
- 我不想让爱丽丝试图指点她
ObjectA
在鲍勃家ObjectB
.
- 我不想让鲍勃尝试改变
User_Id
on his ObjectA
成为爱丽丝。
(1) 的解很简单;我将确保我的 SaveChanges 方法有一个[Authorize]
属性。
我可以轻松地使用 Fiddler 构建 SaveChanges 请求来重现问题 2 到 4 - 例如,我可以构建一个更改的请求Alice
的 ObjectS 指向 Bob 的ObjectB
。消息内容可能如下所示:
"entities":
[
{
"Id":1,
"ObjectB_Id":2,
"SomeField":"Alice's ObjectA",
"User_Id":1,
"entityAspect":
{
"entityTypeName":"ObjectA:#MyNamespace",
"defaultResourceName":"ObjectAs",
"entityState":"Modified",
"originalValuesMap":
{
"ObjectB_Id":"1"
},
"autoGeneratedKey":
{
"propertyName":"Id",
"autoGeneratedKeyType":"Identity"
}
}
}
],
正如我所期望的,当服务器端没有实现安全性时,这会保留更新后的值ObjectB_Id
进入数据库。
不过,我也确认过,如果没有条目ObjectB_Id
in the originalValuesMap
,那么即使我更改值ObjectB_Id
在消息的主体中,它没有在数据库中更新。
一般规则?
所以,我认为这意味着我需要在服务器上遵循的一般安全规则是:
[2013 年 7 月 4 日编辑 - 为清晰起见重写]