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

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(使用前将#替换为@)

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

  • MySQL如何在没有过程/函数的情况下执行命令块

    我尝试在 MySQL Workbench 上运行一段 SQL 命令 就像在 SQL Server 上一样 但它告诉我 声明在此位置无效 我在网上看到了各种这样的例子 我真的不明白为什么会出现这个错误 一些提示 代码 其中 SQL Serve
  • 如何设置 Hibernate 读取/写入不同的数据源?

    使用 Spring 和 Hibernate 我想写入一个 MySQL 主数据库 并从基于云的 Java Web 应用程序中的另一个复制从属数据库中读取数据 我找不到对应用程序代码透明的解决方案 我真的不想更改我的 DAO 来管理不同的 Se
  • 比较两个表并找到匹配的列

    我有两个表 table1 和 table2 我需要编写一个选择查询 它将列出两个表中存在的列 mysql 我需要为不同的桌子做 一次2个 这可能吗 我尝试使用INFORMATION SCHEMA COLUMNS但我无法做对 SELECT a
  • 保护存储过程

    我想知道是否有一种方法可以对某些用户隐藏存储过程的文本 我正在使用 MySQL 5 1 48 和 Net Connector 6 2 3 以及 Visual Studio 2008 SP1 我在 MySQL 中有两个用户 一个是 root
  • 如何在 WordPress 中添加 PHP 页面链接到我的页脚

    我创建了一个自定义 PHP 页面名称 privacy policy 名称为privacy php 我如何链接页脚中的页面 以便当有人点击隐私链接时页面打开 我已在此页面中调用页眉和页脚 这个怎么做 谢谢 In the wp content
  • 在 Magento 中使用缩略图切换基本图像

    在定制的产品视图页面上 我正在处理基本图像 大图像 和缩略图列表 这些缩略图是与媒体库中的产品相关的其他图像 它们只是普通图像 而不是定义的图像 缩略图 我的任务是获取它 以便当您单击缩略图时它会更改上面的基本图像 我已经可以工作了 但是我
  • 表被指定两次作为 INSERT 的目标和单独的数据源

    我做了这个查询 但它给了我错误 就像标题中一样 INSERT INTO data waktu vaksinasi id binatang id vaksin tanggal vaksin status vaksin VALUES 1 1 S
  • 当 url 不存在时 file_get_contents

    我正在使用 file get contents 访问 URL file get contents http somenotrealurl com notrealpage 如果 URL 不真实 则返回此错误消息 如何让它优雅地出错 以便我知道
  • 将歌词存储在 MySQL 数据库中

    我想知道在 mysql 数据库中存储音乐 歌词 的最佳方式是什么 以及用于此目的的设置是什么 另外 我想要表格来存储断线 我正在考虑使用 指示新行并使用 php 替换字符串 我不知道从哪里开始 或者使用什么参数 varchar int 我知
  • 使用以太坊 RPC 获取代币余额?

    如何通过以太坊RPC显示代币余额 id 0 data array data jsonrpc 2 0 data id id data method eth call data params from gt 0x0 to gt 0x0 data
  • PHP - 为什么使用 Guzzle 而不是 cURL?

    在我的应用程序中 我最初开始使用 cURL 从各种 API 检索数据 今天 我尝试使用 Guzzle 来完成同样的任务 到目前为止 cURL 和 Guzzle 似乎都工作得同样好 判断依据Github https github com gu
  • PHP 数字:小数点仅在需要时可见

    我想知道是否存在一些函数可以自动按十进制格式化数字 所以如果我有 所以我的答案是 如果我的数据库中有 DECIMAL 数据格式 仅当它
  • 在php中用逗号替换空格和换行符

    我搜索过但找不到任何有帮助的东西 所以 我有一堆数据 我基本上只需要在它们之间添加逗号 这些数据都来自记录 所以它的形式如下 13 566 888 958 898 我需要像这样输出 13 566 888 958 898 如果我可以将任意 2
  • php.ini 在哪里? [复制]

    这个问题在这里已经有答案了 我运行 phpinfo 它说它在 C Windows 中 但它不在那里 它不在 php 文件夹中 我系统搜索了一下 没有找到 它藏在哪里 运行此代码 我假设您的 php 正在运行 您无法仅找到 php ini 文
  • 如何在 Centos 7 上手动安装 PHP-Zts

    我想安装 pthreads 当我尝试安装时 我会收到此错误 checking for ZTS no configure error pthreads requires ZTS please re compile PHP with ZTS e
  • Laravel Eloquent ORM 返回 stdClass 而不是实际模型

    我正在做 mymodel MyModel where url domain gt first 这返回了一个 MyModel 对象 现在 不知何故 它返回了一个 stdClass 发生了什么 laravel 有更新吗 我改变了什么吗 Than
  • 如何读取 sql 查询到 pandas dataframe / python / django

    我在下面使用这个views py获取应用程序 from django db import connection def test request cursor connection cursor sql SELECT x n from ta
  • 在高负载站点中使用 PHP 的策略

    在你回答这个问题之前 我从未开发过任何足够流行的东西来达到高服务器负载 把我当作 叹气 一个刚刚登陆地球的外星人 尽管我了解 PHP 和一些优化技术 我正在开发一个工具PHP如果效果好的话 可以吸引相当多的用户 然而 虽然我完全有能力开发该
  • 使用 Javascript 编辑和保存用户 HTML - 安全性如何?

    例如我有一个Javascript 支持的表单创建工具 您可以使用链接添加元素的 html 块 如输入字段 并使用 TinyMCE 来编辑文本 这些是通过自动保存功能保存的 该功能在特定事件的后台执行 AJAX 调用 被调用的保存函数负责数据
  • 开发中的 Laravel 和视图缓存——无法立即看到变化

    我和一些朋友决定开始一个项目 我们偶然发现了 Laravel 并认为它可能是一个很好的工具 我们开始在本地使用它来开发一些页面 并注意到一些奇怪的事情 当我们用不同的信息更新视图时 大约需要 5 到 10 分钟视图信息才会发生变化 这就像

随机推荐