1

我有一个用 ColdFusion 编写的网站,其中包含通常的交互式网页和一些通过 CF 调度程序运行的任务。目录布局是

/
/app
/scheduledTasks

我希望任务能够使用在 /app 内的 application.cfc 中创建的所有相同设置等,因此我想将整个 /scheduledTasks 目录移动到 /app 中。问题是 application.cfc 使用 cflogin 机制和我自己的登录表单。CF 调度程序只允许您为 HTTP 基本身份验证提供用户名和密码。计划任务永远不会超过这一点。我该如何解决这个问题,或者有更好的方法开始?

我想知道在我的 application.cfc 的 OnRequestStart 中查看一些 CGI 变量,例如用户代理、远程 IP 和/或 URL 参数中的魔法值,如果都在那里,绕过安全性,因为我“知道”它是CF 的调度程序在另一端。这不是很好的安全性,但它可能是可以接受的。

我还想知道在我的根目录中创建一个新的 application.cfc,该 /app 中的 application.cfc 继承自该文件。我会将任务留在原处,并在那里放置一个新的 application.cfc,它从根目录继承常见的东西。不过,这会增加复杂性,并且在尝试从 /scheduledTasks 访问 /app/cfcs 内的 CFC 时遇到问题。

有没有人遇到过类似的问题并解决了?

4

4 回答 4

6

将计划任务留在他们自己的文件夹中,就像您当前将其从站点的根目录中一样。

在 scheduletasks 文件夹中创建一个 application.cfc ,扩展应用程序目录中的一个,如下所示:

<cfcomponent extends="/.apps/application">

重载 onrequeststart 方法并像这样进行身份验证:

<cffunction name="onRequestStart" returntype="void" access="public" output="false">
    <cfargument name="targetPage" type="any" required="true">
    <cfif not structkeyexists(url, "access") or not url.access eq application.ApplicationName>
        <cflocation url="/" addtoken="false">
    </cfif>
</cffunction>

这是非常基本的安全性,但可以完成工作。根据您的喜好定制。

于 2009-11-04T18:42:08.583 回答
1

顺便说一下,我会为计划的应用程序创建一个自定义角色。然后,在您的主应用程序中,当请求来自本地服务器时自动应用它。

于 2009-11-04T22:18:03.620 回答
1

ColdFusion 计划任务在 CGI 信息中传递某些数据,包括:

HTTP_USER_AGENT=CFSCHEDULE

现在 HTTP_USER_AGENT 是可伪造的,所以下一个问题是确定您需要访问文件夹的安全性。您只希望 CF 运行这些任务吗?还是您也想从外部运行它们?只是你的电脑?等等。一旦确定了你就可以为它编写代码,而 rip747 的解决方案是一个很好的解决方案,所以我不打算提出任何其他建议!;)

于 2010-01-27T17:21:16.883 回答
1

我将检查请求是否来自本地 IP(如果您在同一台服务器上运行计划......).....另一个(我相信更好)解决方案是我通常做的允许 web 服务或监视例程外部使用且无需登录:

在您的 application.cfc 方法 onApplicationStart 上,输入如下内容:

<!--- List of Directories Excluded from Login --->
<cfset application.ExcludedLoginDirs = "/monitoring/registration/wservices/">   

然后在您的 onSessionStart 上(或您使用的任何方法来防止未经授权的访问并重定向到登录:

<!--- Find current directory --->
<cfset currentDir = listgetAt("-," & cgi.Script_Name, listLen("-," & cgi.script_Name, "/")-1, "/")>

<!--- Exclude LOGIN if user authenticated or Directory Excluded --->
<!--- In this code, I FORCE login if user is NOT autenticated AND directory is NOT excluded --->
<cfif Val(session.User_ID) EQ 0 AND ListFind(application.ExcludedLoginDirs, "#currDir#", "/") EQ 0> 
      ............Login..........
</cfif>

ETC.......

这种方法的一些优点是: 1.如果调用方软件没有实现cookie并保持会话状态,它可以工作。2. 如果调用方软件确实保持会话,则授予访问在调用 url 中传递 cfid 和 cftoken 的受保护页面。3.如果非常灵活并且除了最终添加一个新目录并销毁应用程序之外没有维护......(我使用

<cfif isDefined("url.destroyApp")>
     <cfset reinit = this.onApplicationStart()>
</cfif> 

在 onRequestStart 方法和

<cfset StructClear(application)>

作为我 onApplicationStart 方法的第一行。

希望能帮助到你!

于 2014-03-17T06:40:12.497 回答