ColdFusion 变量竞争条件?

2023-12-28

我需要一些帮助来确定为什么这个特定的代码在极少数情况下会产生竞争条件。我找到了一个解决方案,我也会概述它,但我真的很想理解它。

我们有一个基于 CMS 的系统,由许多松散地基于保险丝盒模型的模块组成。一切都通过单个index.cfm 运行。

在 Index.cfm 中,我们创建了几个组件实例,其中一些实例基于在 Application.cfc 中创建的 APPLICATION.PortalApp 实例。我没有包含该代码,因为它并不完全相关:

<cfset REQUEST.ActionHandler = CreateObject("Component", "Components.ActionHandler").init(APPLICATION.PortalApp.Config) />
<cfset VARIABLES.Modules = CreateObject("Component", "Components.Modules").init(APPLICATION.PortalApp.Config, REQUEST.ActionHandler.GetModuleList(), REQUEST.ActionHandler.GetSuppressOutput(), REQUEST.ActionHandler.GetRoleList(), REQUEST.ActionHandler.GetAccessList(), REQUEST.ActionHandler.GetMasterRoleList()) />

实例化这些对象后,我们通过调用作为应用程序 Application.PortalApp 的一部分实例化的 PageManager 组件来获取页面上模块的内容(基于其“窗格”:顶部、左侧、中间、右侧)。

<cfsavecontent variable="Variables.Portal_Content.Top"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 0  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Left"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 1  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Middle"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 2  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Right"><cfset APPLICATION.PortalApp.PageManager.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 3  ) /></cfsavecontent>

PageManager.DisplayContent 基本上循环模块并将它们包装在包装器中。然而,在某些时候,存在竞争条件,函数会出现坑洞,并且根本不显示任何模块。它似乎是基于 VARIABLES.Modules 变得损坏,但这是在不共享的 VARIABLES 范围内。

为了解决这个问题,我们将代码更改为以下内容:

<!--- If we do not use VARIABLES scope and create a ContentManager, race condition can cause empty modules --->
<cfset VARIABLES.CurrPageMgr = CreateObject("Component", "Components.ContentManager").init() />

<cfsavecontent variable="Variables.Portal_Content.Top"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 0  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Left"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 1  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Middle"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 2  ) /></cfsavecontent>
<cfsavecontent variable="Variables.Portal_Content.Right"><cfset VARIABLES.CurrPageMgr.DisplayContent( SESSION, REQUEST.ActionHandler, VARIABLES.Modules, 3  ) /></cfsavecontent>

ContentManager 的 DisplayContent 与 PageManager.DisplayContent 完全相同,但 ContentManager 仅存在于 VARIABLES 范围内,而 PageManager 作为 APPLICATION 的一部分存在。

在收到报告后,很难重现这一点。我基本上启动了一个 jmeter 会话,根据我知道会因 VARIABLES.Module 损坏而触发的条件设置断点,尽可能地对开发服务器进行攻击。这是重现它的唯一方法。

我也不是 100% 确定这个修复有效,但到目前为止 jmeter 还没有触发它到位的条件。

编辑:根据请求,DisplayContent 函数:

<cffunction name="displayContent" access="public" output="true">
    <cfargument name="SessionData" required="yes" type="Struct" />
    <cfargument name="ActionHandler" required="yes" type="ActionHandler" />
    <cfargument name="Modules" required="yes" type="Modules" />
    <cfargument name="Pane" required="yes" type="numeric" />
    <cfswitch expression="#Arguments.Pane#">
        <cfcase value="1"><cfset Variables.blnPane = ARGUMENTS.Modules.getLeft()></cfcase>
        <cfcase value="2"><cfset Variables.blnPane = ARGUMENTS.Modules.getCenter()></cfcase>
        <cfcase value="3"><cfset Variables.blnPane = ARGUMENTS.Modules.getRight()></cfcase>
        <cfdefaultcase><cfset Variables.blnPane = ARGUMENTS.Modules.getTop()></cfdefaultcase>
    </cfswitch>
    <cfif VARIABLES.blnPane>
        <cfset VARIABLES.qryPaneModules = ARGUMENTS.Modules.GetModulesInPane(Arguments.Pane)>
        <cfset VARIABLES.aryModulesInPane = ArrayNew(1)>
        <cfloop query="VARIABLES.qryPaneModules">
            <cfset VARIABLES.blnResult = ArrayAppend(aryModulesInPane,VARIABLES.qryPaneModules.MOD_SYS_NR)>
        </cfloop>
        <cfset VARIABLES.Template = "../CustomTags/Portalv#ARGUMENTS.SessionData.intPortalVersion#/DisplayModuleAlternate.cfm">
        <cfif Arguments.ActionHandler.GetDocumentType() EQ 3>
            <cfset VARIABLES.Template = "../CustomTags/Portalv#ARGUMENTS.SessionData.intPortalVersion#/DisplayXMLModule.cfm">
        </cfif>
        <cfif VARIABLES.qryPaneModules.recordcount GT 0>
            <cfloop index="VARIABLES.modLoop" from="1" to="#ArrayLen(VARIABLES.aryModulesInPane)#">
                <cfparam name="VARIABLES.aryModulesInPane[VARIABLES.modLoop]" default="0">
                <cfset VARIABLES.objModuleInfo = ARGUMENTS.Modules.GetModuleInfo( VARIABLES.aryModulesInPane[VARIABLES.modLoop], ARGUMENTS.Modules.GetModules() ) />
                <cfif NOT IsNumeric(VARIABLES.objModuleInfo.intModuleID)>
                    <cfset VARIABLES.objModuleInfo.intModuleID = 0 >
                </cfif>
                <cfmodule template="#VARIABLES.Template#"
                    ModuleID="#VARIABLES.objModuleInfo.intModuleID#"
                    ModuleName="#VARIABLES.objModuleInfo.strModuleName#"
                    SecurityLevel="#VARIABLES.objModuleInfo.intRoleTypeID#"
                    ModuleDSN="#VARIABLES.objModuleInfo.strModDBDSN#"
                    ModuleUserName="#VARIABLES.objModuleInfo.strModDBUserID#"
                    ModulePassword="#VARIABLES.objModuleInfo.strModDBPassword#"
                    AlternateFunctionID="#VARIABLES.objModuleInfo.intAlternateFunctionID#"
                    AlternateFunctionName="#VARIABLES.objModuleInfo.strAlternateFunctionName#"
                    InstructionFileID="#VARIABLES.objModuleInfo.intManualID#"
                    ModuleOps="#VARIABLES.objModuleInfo.blnModuleOps#"
                    ModuleSource="#VARIABLES.objModuleInfo.strModuleSource#"
                    ItemID="#VARIABLES.objModuleInfo.intModItemID#"
                    AutoLoginID="#VARIABLES.objModuleInfo.intAutoLoginCategoryID#"
                    IPS_objPortalSessionData="#ARGUMENTS.SessionData#"
                    ModuleList="#ARGUMENTS.ActionHandler.GetModuleList_SingleRecord(VARIABLES.objModuleInfo.intModuleID)#"
                    ModulesComponent="#ARGUMENTS..Modules#"
                    ControlHeaderIR = "#VARIABLES.objModuleInfo.blnControlHeaderIR#"
                    BorderIR = "#VARIABLES.objModuleInfo.blnBorderIR#"
                    IPS_strPortalRoot = "#VARIABLES.IPS_strPortalRoot#"
                    IPS_strPortalURL = "#VARIABLES.IPS_strPortalURL#"
                    Wrapper = "#Arguments.ActionHandler.getWrapper()#"
                    Definition = "#VARIABLES.objModuleInfo.strModuleDef#"
                    Category = "#VARIABLES.objModuleInfo.strModuleCat#"
                    aryModulesInPane = "#VARIABLES.aryModulesInPane#"
                    blnLockIR = "#VARIABLES.objModuleInfo.blnLockIR#"
                    strMessageTE = "#VARIABLES.objModuleInfo.strMessageTE#" >

            </cfloop>
        </cfif>
    </cfif>
</cffunction>

问题是在 PageManager 组件的 DisplayContent 函数中使用 VARIABLES 作用域(该组件被实例化为应用程序的一部分,因此被共享)。在这种情况下,变量范围将被共享,从而导致竞争条件。

除了在另一个组件中复制该函数并在 index.cfm 的 VARIABLES 范围中实例化它之外,您还可以从 DisplayContent 函数中的 VARIABLES 范围切换到 LOCAL 范围(假设您不需要在功能)。当使用 jmeter 进行压力测试时,这两种方法都可以防止竞态条件再次出现。

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

ColdFusion 变量竞争条件? 的相关文章

  • ColdFusion XLS“导出”和字符编码

    我正在使用 HTML 表格将数据从页面 导出 到 Excel 该表在浏览器中看起来很好 但在 Excel 中 撇号 商标符号等特殊字符的编码不正确 如果我在记事本中打开导出的文件并将其另存为 ANSII 编码 然后在 Excel 中打开它
  • Laravel 速率限制器

    我对 Laravel 相当陌生 目前使用的 API 限制为每分钟 25 个请求 我有一个控制器方法sendRequest 所有方法都使用它向 API 发送请求 因此我认为这是放置速率限制器的地方 该限制器检查在尚未达到限制的情况下是否可以将
  • 带有 Base64 图像的 v-card-media

    我正在 ColdFusion 中创建验证码图像 并将其作为 Taffy 的 REST feed 返回 然后在 Vuetify 中显示 ColdFusion 太妃糖代码
  • 使用 jquery 偶尔出现 ajax 响应错误 {readyState=0, status=0, statusText="error"}

    我遇到了使用 jquery 和 Coldfusion 服务器端 的 AJAX 响应问题 有时有效 有时无效 当我测试直接调用它的服务器端组件时 它总是有效 所以我猜问题出在 ajax 响应上 我直接从服务器获取 serverurl 所以它不
  • ColdFusion UI 标签到 jQuery 的转换

    我正在尝试将一些具有各种 ColdFusion UI 标签的代码转换为 jQuery 我必须制定一个迁移计划 目前这就是我所拥有的 Tag Replacement CFApplet CFCalendar http jqueryui com
  • ColdFusion Twitter API 错误请求

    我正在开展一个项目 涉及抓取 Twitter 数据信息 解析它并将其显示在我们的网站上以用于管理目的 我们还在考虑通过与 Twitter REST API 联锁的 Web 界面发布推文或更新 但首先 我想做简单的 GET 我正在尝试通过 d
  • 如何从 java 类(在 Lucee 中)中的方法返回 Coldfusion 结构?

    我正在编写一个java类 并且想从方法返回一个coldfusion结构 结构扩展了映射和其他东西 我不是 Java 程序员 所以我不知道如何解决这个问题 这是 lucee java 文档 http javadoc lucee org 当我尝
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • 我应该自行提交表格还是提交到外部文件?

    我对编程相当陌生 特别是 Coldfusion 我很好奇我是否将表单提交到其所在的页面并在那里处理结果 或者是否应该将其提交到外部文件进行处理是否有区别 然后从那里重定向 它可以发挥作用 当我第一次开始编程时 我经常会做这样的事情 myfo
  • 根据 rowversion 值更新记录?

    我最近实现了SQLrowversion以防止我的系统中出现并发问题 我用rowversion更新表中的单行时在 where 子句中 到目前为止 我已经测试过 似乎是一个很好的解决方案 现在我正在寻找一种简单的方法来在我的系统中实现此功能 这
  • 在 Java 中引发竞争条件

    我必须编写一个引发竞争条件的单元测试 以便我可以测试稍后是否可以解决问题 问题是竞争条件很少发生 可能是因为我的计算机只有两个核心 代码如下 class MyDateTime String getColonTime datetime is
  • 如何在链接到表单的工作表中执行 Google 工作表脚本之前等待 Google 表单脚本完成执行

    我有两个脚本 一个链接到 Google 表单 另一个链接到 Google 表格 我需要确保 Google 表单脚本在执行链接到 Google 表单的工作表的 Google 工作表脚本主体之前完成执行 如何才能做到这一点 需要等待 Googl
  • 如何获取当前文件的父文件?

    要获取当前 cfm我使用的文件 GetFileFromPath GetCurrentTemplatePath 有没有一种简单的方法来获取当前文件的父文件 IE 如果当前文件是 MyApp Users addUser cfm我想回来Users
  • 严重: getRealPathFromConn 错误

    目前我正在调试我们的应用程序中一个看似随机的错误 我将尽力提供尽可能多的细节 基本上一段时间后 我们服务器上某个应用程序的应用程序池就会停止 我必须启动它 或者有时重新启动 Coldfusion 或更糟糕的是机器才能再次运行 服务器日志表明
  • 将 Topaz 签名字符串(十六进制)转换为图像

    我正在尝试将黄玉签名板集成到我的 ColdFusion 应用程序中 我想从 pad 捕获签名 将其转换为 ColdFusion 可以在浏览器中显示的格式并保存到磁盘 使用他们的文档 我能够以十六进制格式检索捕获的签名 我认为 我正在关注他们
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 使用 Coldfusion 的 CFFILE 标签监控 FFMpeg 的进度日志

    我想学习如何使用 ColdFusion 中的 CFFILE 标签来读取文本文件的内容 就我而言 该文本文件是 FFMpeg 在对媒体文件进行转码时生成的进度日志 我想编写一个 ColdFusion 脚本 该脚本将定期轮询进度日志 直到日志表
  • 在 ColdFusion 中调用 String 上的底层 java 方法是否安全?

    Adobe ColdFusion 基于 Java 构建 CFML CFSCRIPT 中几乎所有简单变量都是java lang String直到操作需要它是某种类型 我一直想用startsWith in String而不是体积更大的 CFML
  • django 中计数器的原子增量

    我正在尝试自动增加 Django 中的一个简单计数器 我的代码如下所示 from models import Counter from django db import transaction transaction commit on s
  • Windows 2k8 上的 Coldfusion 10 - .com/ 加载正常,但 .com/index.cfm 给出 404

    我正在按照 Pete Freitag 的新 CF10 锁定指南设置一台新服务器 CF10 W2K8 我安装了一个测试站点 如果我打开 www mydomain com 它会加载默认文档 index cfm 但是 如果我尝试 www mydo

随机推荐

  • 具有多个命令的 CTest

    我正在使用 CTest 构建一些测试 通常 我可以简单地通过以下行设置测试 ADD TEST Test Name executable args 但是 我遇到了一个问题 我有一些测试需要运行两个命令才能工作 有什么方法可以在一个 ctest
  • TwoWay 或 OneWayToSource 绑定无法对只读属性起作用

    我有一个只读属性 需要在文本框中显示 并在运行时收到此错误 我已经设置了IsEnabled False IsReadOnly True 没有运气 其他搜索说只读应该修复它 但不适合我 我有一个丑陋的解决方法 添加一个虚拟设置器 没有代码很难
  • Internet Explorer 中的图像数据集

    我有一个数组缓冲区 名为MEM 大于画布宽度 高度尺寸 我想将 arrayBuffer 数据绘制到画布上 imgData data set 应该可以工作 因为 imgData data 是一个 Uint8Array 它具有 set 方法 它
  • 如何在 ASP.NET Core 中获取 HttpContext.Current? [复制]

    这个问题在这里已经有答案了 我们目前正在使用 ASP NET Core 重写 转换我们的 ASP NET WebForms 应用程序 尽量避免重新设计 有一个部分我们使用HttpContext在类库中检查当前状态 我怎样才能访问HttpCo
  • 在invalidatelat观察者内增加reactivevalue

    我正在尝试构建闪亮的应用程序来进行一个非常简单的测验 我有一个包含 10 个问题的 data frame 用户点击回答 0 或 1 它一直有效 直到我尝试实施timer 倒数以便下一个问题在 5 秒后自动出现 使用invalidateLat
  • 如何在 netlogo 上创建计时器?

    对于我的迷宫项目 我想创建一个监视器按钮来跟踪海龟从开始到结束所需的时间 我该如何为计时器编写代码 查看reset timer and timer并在文档中 在迷宫设置期间 执行reset timer 在迷宫运行过程中 您可以使用以下命令检
  • 解构 C# 元组

    是否可以像 F 一样在 C 中解构元组 例如 在 F 中 我可以这样做 in F let tupleExample 1234 ASDF let x y tupleExample x has type int y has type strin
  • 如何在 Delphi 中使用 dll 导出的 C++ 类

    有没有办法在 Delphi for win32 中使用 win32 dll 导出的 C 类 是否有其他方法来归档类似的东西 COM NET 您无法导入类 您只能导入函数 鲁迪 维尔修斯 Rudy Velthuis 就该主题撰写了详细的文章
  • Spring Boot应用程序启动后立即关闭

    我正在尝试构建一个简单的 Spring Boot 应用程序 当我运行 Spring Boot 应用程序时 它在启动后立即关闭 下面是控制台日志 Spring Boot v1 4 1 BUILD SNAP
  • 符号导数和积分

    我想集成功能f4关于x然后求新函数的导数t 我可以用数值方法计算积分 有没有办法在R中以符号方式计算这个积分和导数 lambda 1 ci 1 aa lt function u k t f4 lt function x f1 lt func
  • 如何让实验性 ngTemplateOutlet 发挥作用?

    我正在尝试在 Angular2 中构建一个列表组件 该组件从组件的用户那里获取项目 列和项目字段的模板 所以我正在尝试使用ngTemplateOutlet and ngOutletContext 我读过的都是实验性的 但我无法让它发挥作用
  • 使用 RXJava 和 Retrofit 获取标头信息

    我正在尝试将当前使用 Retrofit 的应用程序转换为使用 RX Java 为了处理分页 我传统上是从响应标头中获取 nextPage URL Override public void success Assignment assignm
  • 具有可选属性的 JSON 类型提供程序的数据示例

    我正在尝试使用 JSON 类型提供程序通过 API 访问 StackOverflow StackExchange 数据 它效果很好 但有一点需要注意 API 有一个节流阀 它由 退避 字段发出信号 其中包含您应该退避到下一个请求之前的秒数
  • Python 语音比较

    我有两个 wav 文件 我需要比较并确定它们是否包含相同的单词 顺序也相同 一段时间以来我一直在寻找最好的方法 我不知道如何让 pyspeech 使用文件作为输入 我尝试过让 CMU sphinx 项目正常工作 但我似乎无法让 GStrea
  • NGINX:“客户端在读取客户端请求行时发送了无效方法”

    为 Nginx 设置 SSL 并发出请求后 我收到带有神秘消息的乱码响应client sent invalid method while reading client request line 我在 Alpine Docker 容器中使用
  • 以编程方式获取 iOS 设备的 IMEI 或 UDID

    1 Apple 是否允许开发者检索用户设备的 IMEI 号码和 UDID 2 如何以编程方式获取这些值 3 如果 Apple 不允许开发人员收集 IMEI 号码 他们是否会为设备提供任何其他唯一号码 Apple 不再允许开发人员以编程方式获
  • 模板、内部结构、局部类型和纯虚函数,天哪

    考虑一个示例 其中方法是纯虚拟的 采用模板类型的参数 从外部类型注入 并且该模板类型是本地类型 在函数体中定义 这种情况会导致 g 下的编译时错误 诚然 这是一个相当极端的情况 但它确实源自真实的代码 这是一个可编译 可重现的示例 incl
  • 如何使用 Xcode 和 Git 处理不同的库搜索路径?

    我正在和朋友一起开发一个应用程序 我们使用 git 私有 作为版本控制系统 我们面临的问题是 Xcode 5 1 DP2 给出此警告 Apple Mach O 链接器警告 未找到目录 出现此警告的原因是 Xcode 在我的硬盘上找不到我朋友
  • 在原则 2 中指定表类型/存储引擎

    那么如何在原则 2 中指定用于给定实体的存储引擎呢 我正在创建一个需要全文索引的表 并且只有 MyISAM 存储引擎支持 MySQL 中的全文索引 另一方面 看起来 Doctrine 2 不支持开箱即用的全文索引 也没有全文搜索 那是对的吗
  • ColdFusion 变量竞争条件?

    我需要一些帮助来确定为什么这个特定的代码在极少数情况下会产生竞争条件 我找到了一个解决方案 我也会概述它 但我真的很想理解它 我们有一个基于 CMS 的系统 由许多松散地基于保险丝盒模型的模块组成 一切都通过单个index cfm 运行 在