【发布时间】:2010-11-17 09:53:01
【问题描述】:
我目前遇到了一个问题,我想很多人以前都遇到过,我想知道你是如何处理的。
因此,假设您的应用上有 10.000 个用户。 (每个人都有自己的用户/密码登录来管理他的东西)。 进一步想象,您在后端有一个不断增长的标准化 SQL 表结构,其中包含以下表:用户、订单、订单位置、发票等。
因此,要显示/编辑/删除不是用户表本身的表的内容,您可能会有这样的链接,让 ypur 用户与应用程序交互。
~/Orders/EditOrder?id=12
~/Orders/ShowOrderPosition?orderId=12&posId=443
好的,现在问题来了:
如何以“不复杂”的方式防止用户 A 访问(显示/编辑/删除)用户 B 的数据。
例子:
用户 B 调用:
~/Orders/ShowOrderPosition?orderId=12&posId=443
这是用户A的订单,所以用户B应该无权访问它。
因此,在我的代码中,我需要在每个 SQL 语句之前或之内进行 UserIdentity-check,例如:
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
只有这样我才能确保数据属于请求用户。
要访问用户表当然会变得更加复杂,用户表连接在规范化中“埋藏”得越深(想象像付款或发票这样的表,连接到订单表...)
问题:
您的处理方法是什么,考虑:低复杂性、DRY 和性能
(希望你明白我的意思;))
【问题讨论】:
标签: sql security web-applications normalization