来自Id的Coldfusion加载会话

时间:2012-02-18 05:38:52

标签: coldfusion

有没有办法通过提供正确的CFTOKEN和/或CFID值来加载特定的用户会话?

类似于php的session_id($ id)函数。

或某种方式来更改特定会话的数据。

我需要一个web服务,它将添加或更改特定用户会话的某些信息。我知道CFID和CFTOKEN值,因为我共享一个子域cookie。但是,应用程序位于不同的服务器上

3 个答案:

答案 0 :(得分:2)

您可以通过在URL上传递正确的值来实现,此处提供了更多信息

http://ruthsarian.wordpress.com/2005/10/03/cf-session-hijacking/

  

ColdFusion使用两个唯一值来跟踪用户会话   信息。这些值是CFID和CFTOKEN。它们存储为   cookies,但也可以通过URL和POST数据传递。

     

会话变量是存储特定信息的地方   用户和当前会话(例如用户是否是   登录)。

     

可以通过提供正确的方式来劫持用户的会话   CFID和CFTOKEN在URL或任何地方为服务器赋值   别的你想要的。

这篇文章http://old.nabble.com/ColdFusion-9-Session-Replication-td32621620.html有效地描述了你试图做的事情,它建议不要因网络使用率过高而导致会话复制。

您尝试在多个物理服务器上维护特定会话范围的位置。我过去解决这个问题的方法是维护一个数据库,存储需要在绑定到UUID的物理服务器之间传递的信息。为此,您可以使用CFID / CFTOKEN值作为数据库PK,或者您可以完全创建另一个PK。这将允许您在URL字符串上传递CFID等,然后如果它到达目前尚未命中的服务器(即没有使用那些CFID / CFTOKEN加载会话/会话),那么您可以加载你需要从数据库中获得的变量。

编辑备用非数据库方法

首先在一台服务器上设置一个脚本,即返回的getSessionData.cfm 会话范围内的数据采用可传输格式,即使用     SaveObject()(如果在CF9上),或者可能是SerializeJSON(),类似于     

<!--- on source server, getSessionData.cfm --->
<cfscript>
    WriteOutput(ToBase64(ObjectSave(session)));
</cfscript>

然后设置一个处理程序,它将从另一个服务器请求数据     使用cfhttp请求填充CFID / CFTOKEN来访问会话,然后将该数据提取到新服务器上的会话中。

<!--- on target server --->
<cfhttp url="http://sourceserver/getSessionData.cfm">
    <!--- Params to pass through CFID/CFTOKEN or any other cookie/url/post params etc --->
</cfhttp>
<cfscript>
    structToImportToSession = ObjectLoad(ToBinary(cfhttp.FileContent));
    for (thisStructKey in structToImportToSession) {
        session[thisStructKey] = structToImportToSession[thisStructKey];
    }   
</cfscript>

问题在于,我会对生产环境中我的服务器上的这种脚本感到不安。这也意味着您需要明确知道用户来自哪个物理服务器,以便您可以从正确的服务器请求getSessionData.cfm脚本。

Ben Nadel的这篇文章似乎采用了类似的原则来更新会话数据,同样可以应用于我期望的更新,http://www.bennadel.com/blog/725-Maintaining-Sessions-Across-Multiple-ColdFusion-CFHttp-Requests.htm

就我个人而言,我仍然建议使用数据库驱动方法,因为它为您提供了清除旧会话等更清晰的机制,但是第二个选项应该是可行的,并且可以让您访问所需的内容。

答案 1 :(得分:2)

并不是说这是最好的做事方式,因为它使用的是未记录的代码,可以在不通知版本的情况下进行更改。但您可以使用某些方法来访问会话。

<cfscript>
    appName = 'zadsApp';
    jSessTracker = CreateObject('java', 'coldfusion.runtime.SessionTracker');
    appSessions = jSessTracker.getSessionCollection(JavaCast('string', appName));
    targetSession = appSessions[appName & '_' & sessionCFID & '_' & sessionCFTOKEN];
    // Dumping, reading, writing WILL update the last accessed time.
    // There are ways around this if needed...
    WriteDump(targetSession);
    targetSession.something = 'A new value';
</cfscript>

现在你提到这是在不同的服务器上,我可以仔细检查你是否想要一个单独的服务器来改变另一台服务器上的会话?没有在上面的服务器上放置任何类似的代码(带有会话的代码)?虽然如果代码位于同一台服务器上会更容易,但是你可以使用JMX远程执行这样的代码......但是我确信必须有一个更简单的方法来完成所有的工作。此

答案 2 :(得分:0)

只要会话未过期,您就可以使用网址中的CFID和CFTOKEN访问会话