ColdFusion计划任务 - 使用<cflogin>时如何保护?</cflogin>

时间:2009-11-04 16:41:49

标签: security coldfusion login scheduled-tasks cflogin

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

/
/app
/scheduledTasks

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

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

我也想知道在我的root中创建一个新的application.cfc,/ app中的application.cfc继承自。我将任务保留在原来的位置,并在那里放置一个新的application.cfc,它从根目录继承了常见的东西。这会增加复杂性,但在尝试从/ scheduledTasks访问/ app / cfcs中的CFC时遇到了问题。

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

4 个答案:

答案 0 :(得分:6)

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

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

<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>

这是非常基本的安全性,但会完成工作。根据自己的喜好定制。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

HTTP_USER_AGENT = CFSCHEDULE

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

答案 3 :(得分:1)

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

在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>

等等......

这种方法的一些优点是: 1.如果调用者软件没有实现cookie并保持会话状态,它就可以工作。 2.如果呼叫者软件保持会话,则允许访问通过cfid&amp;的受保护页面。 cftoken在通话网址中。 3.如果非常灵活,除了最终添加新目录和DESTROY THE APPLICATION ...之外没有维护...(我使用

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

on onRequestStart方法和

<cfset StructClear(application)>

作为onApplicationStart方法的第一行。

希望它有所帮助!