php - 验证多级关系依赖关系的最佳方法

标签 php mysql relational-database

假设你有实体A,B,C和D。
D与C有关
C与B有关
B与A有关
此外,只有当用户拥有d时,才允许用户对d进行操作。
在应用程序的某个状态下,您包含一个指向访问d的页的链接。因此,您包含d的id作为get或post参数。
如果用户单击链接,应用程序将检索d的id并开始对d进行操作。
简单的应用程序使用这样的url[模块url重写]:

http://www.myServer.com/?action=1234&entity=D&ID=23

如何验证是否允许用户在d上操作?
a)显而易见的解决方案是:给定d,找到c,然后找到b,最后找到a。如果链在某个地方断了,访问d的权限将被拒绝。不幸的是,这需要4个数据库访问,而不仅仅是一个。
b)另一种解决方案是将d的id保存在当前会话中的一组可访问实体中,供下一个要呈现的页面使用。
c)作为替代方案,可以对get和post参数进行加密。在每个页面请求上,第一个操作将是解密请求的参数。如果解密操作失败,访问将被拒绝。
或者,在无穷远处,散列所有页面中的所有链接,在会话中保留一个将散列与url关联起来的映射,并只将散列写入网页。
e)最后,您可以在D中保留对A、B和C的引用,在C中保留对A和B的引用,在B中保留对A的引用。因此,在每个级别上,都可以立即找到根实体。
在这种情况下你有什么办法?为什么呢?
虽然我包含了php标记,但我不想把这个问题集中在语言上。我很乐意得到总的建议。或解决方案,这些解决方案已经在例如ORM层中实现。
更新-1
最后,我选择了d)。
一般原则:
确保以某种方式下级实体的id总是以安全/可信的方式传递。这样,第三方就无法改变他们的价值观。
细节:
此选项按设计提供了许多好处:
首先,链接页面的id或其他参数永远无法到达浏览器。而不是
http://www.myServer.com/?action=1234&entity=D&ID=23

大多数页面都是这样链接的
http://www.myServer.com/?forwardHash=78sd7sdf98asd7ad5aa76asa4a465

要执行的下一页的所有参数都完全保存在用户会话中。
由于页面的所有参数都保存在用户会话中,因此需要进行的检查要少得多。尤其是,上面提到的关系依赖性检查不再有用了。如果某个东西在用户的会话中,则它是从以前受信任的对话框步骤中放置的。
此外,还可以强制用户只调用当前呈现页面上可用的链接。每次他们调用链接时,应用程序可能会使页面的所有其他链接失效。因此,用户将无法在多个窗口中打开页面,并认为他们看到了应用程序的两种不同“状态”。如果他们两次调用链接,应用程序可能会显示错误消息。
最后,可以直接建立一些我称之为子工作流对话框的东西:您可以通过在会话中的连续堆栈上推送当前页面的url并打开编辑对话框步骤来启动对话框。用户可以有序结束或有意取消对话框工作流。如果连续堆栈不为空,则取消工作流链接可能自动显示为用户选项。
通过保持会话中堆栈上的continuation,它与当前运行的对话框步骤完全隔离。对话步骤甚至不知道调用方的任何信息。
通过将功能包装在一个小的管理器调用中,子进程最终调用flowmanager::finishflow()。此调用从堆栈中弹出一个延续,并将浏览器重定向到此页-有效地返回到工作流开始的位置。
由于我们使用了一堆连续性,因此甚至可以运行从属于其他子工作流的子工作流。

最佳答案

显而易见的解决方案是:给定d,找到c,然后找到b和
最终找到A。如果链子在某个地方断了,就可以进入D
拒绝。不幸的是,这需要-如果实现很简单的话-4
数据库访问,而不仅仅是对a的访问。
我想那是可能的。这在一定程度上取决于“related to”是什么意思,但是假设一个相对简单的模式,我希望您能够在一个sql语句中连接所有四个表。如果缺少链的一部分,查询将不返回行。
还是我遗漏了什么?

关于php - 验证多级关系依赖关系的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783575/

相关文章:

mysql - EAV是 'bad',但是类表继承的可维护性如何呢?

MySQL:组合表1中的多个列并插入表2中的1列

php - Magento 2 获取网站

php - 保护 WYSIWYG 输入免受 PHP 中的 XSS 攻击?

c# - MySql 连接,我可以让它保持打开状态吗?

python - Django模型的字段数小于对应的数据库表

php - MySQL - 将单个 ID 号关联到多个 ID 号

javascript - 如何交替显示滑动div

php - 正则表达式在 PHP 中提取一个 JavaScript 变量

MySQL:没有特定列值的连接表列