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

2023-12-05

假设您有实体 A、B、C 和 D。

  • D 与 C 相关
  • C 与 B 相关
  • B 与 A 相关

此外,用户仅被允许在 D 上运行,如果用户owns A.

在应用程序的某个状态下,您可以包含一个指向访问 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 次数据库访问,而不仅仅是 A 的一次。

B)另一个解决方案是保留D当前会话的ID在一组可访问实体中,供下一个要呈现的页面使用。

C)作为一种替代方案,人们可​​以加密 GET 和 POST 参数不知何故。对于每个页面请求,第一个操作是解密请求的参数。如果解密操作失败,访问将被拒绝。

D)或者,在无穷大时,散列所有页面中的所有链接,在会话中保留一个将哈希值与 URL 关联起来的映射,并且仅将哈希值写入网页。

E)最后,您可以在 D 中保留对 A、B 和 C 的引用,在 C 中保留对 A 和 B 的引用,在 B 中保留对 A 的引用。因此,在每一级别,人们都能够立即找到根 entity.

遇到这种情况你的解决办法是什么?为什么?

虽然我包含了 PHP 标签,但我不想将这个问题集中到一种语言上。我很高兴收到一般性建议。或者已经在例如中实施的解决方案ORM layers.

UPDATE-1

最后我选择了D).

一般原则:

确保某种从属实体的 ID 始终以安全/可信的方式传递。这样,第三方就无法改变他们的价值观。

Details:

此选项在设计上提供了许多好处:

首先,链接页面的 ID 或其他参数永远不会到达浏览器。代替

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

大多数页面都是这样链接的

http://www.myServer.com/?forwardHash=78sd7sdf98asd7ad5aa76asa4a465

所有参数下一页要执行的内容已完全保存在用户会话中.

由于页面的所有参数都保存在用户会话中,需要更少的检查。特别是,上面提到的关系依赖性检查不再使用。如果用户会话中存在某些内容,则该内容是从之前的内容中放入的可信对话步骤.

此外,人们甚至可以强制用户仅调用当前呈现页面上可用的链接。每次调用链接时,应用程序可能会使页面的所有其他链接无效。因此,用户将无法在多个窗口中打开页面并认为他们看到了应用程序的两种不同“状态”。如果他们调用链接两次,应用程序可能会显示错误消息。

最后,人们可以直接建立我称之为的东西子工作流程对话框:您可以通过将当前页面的 URL 推送到会话中的连续堆栈并打开编辑对话框步骤。用户可以有序结束或有意取消对话工作流程。 A取消工作流程链接如果连续堆栈不为空,则可能会自动显示为用户选项。

通过将延续保留在会话中的堆栈上,它可以与当前运行的对话步骤完全隔离。对话步骤甚至不知道有关其调用者的任何信息。

通过将功能包装在一个小的管理器调用中,子流程最终调用 FlowManager::finishFlow()。此调用从堆栈中弹出一个延续并将浏览器重定向到此页面 -有效地返回到工作流程开始的点.

由于我们使用一堆延续,甚至可以运行从属于其他子工作流程的子工作流程.


显而易见的解决方案是这样的:给定 D,找到 C,然后找到 B 并 最终找到A。如果链在某处断裂,则可以访问D 拒绝。不幸的是,这需要 - 如果简单地实现 - 4 数据库访问,而不仅仅是 A 的访问。

我想这也许是可能的。这部分取决于“相关于”的含义,但假设有一个相对简单的模式,我希望您能够在单个 SQL 语句中连接所有四个表。如果链的一部分丢失,查询将不会返回任何行。

或者我错过了什么?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

验证多级关系依赖关系的最佳方法 的相关文章

  •  
    标记内删除

    我制作了简单的 BBCode 脚本 一切正常 但后来我使用了一个 javascript 库来美化我的代码 pre pre 现在我面临的唯一问题是 br 每行代码后面的标签 pre pre tags 所以问题是我怎样才能删除 br 标记哪些在
  • Mysql用in语句限制

    我正在写一个查询 SELECT user bookmarks id as user bookmark id bookmark id user bookmarks user id bookmark url bookmark website b
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐