我目前遇到了问题,我想很多人之前遇到过这种情况,我想知道你是如何处理它的。
因此,假设您的应用上有10.000个用户。 (每个人都有自己的用户/ pw登录来管理他的东西)。 进一步想象一下,您在后端有一个不断增长的规范化SQL表结构,其中的表包括:用户,订单,OrderPositions,发票等。
因此,为了显示/编辑/删除不具有用途的表的内容,你可能会有这样的链接,让ypur用户与应用程序进行交互。
~/Orders/EditOrder?id=12
~/Orders/ShowOrderPosition?orderId=12&posId=443
好的,现在问题是:
如何防止“无复杂”的用户A访问(显示/编辑/删除)用户B的数据。
示例:
用户B致电:
~/Orders/ShowOrderPosition?orderId=12&posId=443
这是用户A的订单,因此用户B应该无法访问它。
因此,在我的代码中,我需要在每个SQL语句之前或之内进行UserIdentity检查,例如:
select * from OrderPosition op, Order o, User u
where op.Id = :orderId
and op.Fk_OrderId = :orderpositionId
and o.Id = :orderId
and o.Fk_User = :userId
只有这样我才能确保数据属于请求用户。
为达到可用的意愿当然会变得更复杂,usertable-connection在规范化中被“埋没”的程度越深(想象表,如付款或发票,连接到订单表......)
问题:
您处理此问题的方法是什么,结论:低复杂度,干燥和性能
(希望你明白我的意思;))
答案 0 :(得分:2)
这有点像多租户应用程序 - 我已经沿着这条路线走下去,并将ID重新规范化到需要这种检查的所有那些表上(租户ID,在你的情况下,听起来像用户ID)。
然后我创建了一个仅包含该字段的接口,并将其应用于我的模型层中需要此访问权限的所有类。
在我的基本数据访问(存储库)类中,所有选择/更新/删除调用都通过,然后我检查是否该类的接口类型,然后检查当前访问是否匹配那个ID。
当然,这取决于您的代码的结构,以及实现这种全局变化的简单/复杂程度......
答案 1 :(得分:0)
永远不要暴露ids。
如果你必须:加密它们。
答案 2 :(得分:0)
效果
DRY
答案 3 :(得分:0)
请勿使用您加密或未加密的内部ID列,它会在某一天回来咬你。
创建一个随机的,唯一的字符串(GUID,无论如何),其中包含用户和他请求的数据之间的链接。因此,对于用户34567而不是:
<a href="~/Orders/EditOrder?id=12">Edit order</a>
在临时表格中创建记录{“5dsfwe8frf823jrf”,34567,12}并显示:
<a href="~/Orders/EditOrder?txn=5dsfwe8frf823jrf">Edit order</a>
当用户点击该链接时,请从临时表中获取34567,12
。
字符串5dsfwe8frf823jrf
无法猜测=没有安全风险。