【问题标题】:Coldfusion 9 cfscript cfcookie and cookie (script style)Coldfusion 9 cfscript cfcookie 和 cookie(脚本风格)
【发布时间】:2014-04-25 20:59:30
【问题描述】:

我正在尝试在 Coldfusion 9 中将我的 cookie CFIDE 和 CFTOKEN 设置为 HTTPOnly...

这是我尝试过的(没有错误但没有用):

cookie.CFID = "#session.cfid#,httpOnly='true'";
cookie.CFTOKEN = "#session.cftoken#,httpOnly='true'";

我也试过了(没有成功...没有错误):

cookie.CFID = "#session.cfid#;httpOnly='true'";
cookie.CFTOKEN = "#session.cftoken#;httpOnly='true'";

还有这个(我认为只适用于 CF10):

cookie.CFID = {value="#session.cfid#", httpOnly="true"};
cookie.CFTOKEN = {value="#session.cftoken#", httpOnly="true"};

然后这个(没有错误但没有工作):

cookie( name="CFID" value="#session.cfid#" httpOnly="true" );
cookie( name="CFTOKEN" value="#session.cftoken#" httpOnly="true" ); 

当我运行这些时,我会在 Chrome 中执行空缓存硬重新加载。当页面重新加载时,我应该会看到 Resources Cookies HTTPOnly 列显示复选框。

我可能已经筋疲力尽了,可能已经打到了上面的正确组合,但我因为跳得太快而误报了失败。有时缓存的东西会占上风。

我的 CFML 容器样式可以使用,但我的 Application.cfc 是所有脚本样式,我想保持这种样式...那么如何在 Coldfusion 9 中执行此脚本样式?

我的修复更新:

我使用了下面的getPageContex(),但它并没有按原样工作。另外onSessionStart() 事件处理程序更改为使用CreateUUID() 创建session.CFIDsession.CFTOKEN,这在我的Application.cfc 文件中也是新的。所以对于后代来说,这就是代码块的样子。

function onSessionStart(){
getPageContext().getResponse().addHeader("Set-Cookie", "CFID=#session.CFID#;path=/;HTTPOnly");
getPageContext().getResponse().addHeader("Set-Cookie", "CFTOKEN=#session.CFTOKEN#;path=/;HTTPOnly");
}

另一个注意事项:由于某种原因,如果会话被清除并请求 onsessionstart() 处理程序,则上面设置的 cookie 内容将失败。必须添加一个 try catch 块或某种异常处理来解决重新加载问题。最好的办法是升级到经过修补的 Coldfusion 10 版本(或即将发布的 CF 11)。

【问题讨论】:

    标签: cookies coldfusion coldfusion-9 httponly cookie-httponly


    【解决方案1】:

    您可以使用 PageContext 对象在 cfscript 中设置 cookie:

    getPageContext().getResponse().addHeader("Set-Cookie", "CFID=#session.CFID#;path=/;HTTPOnly");
    getPageContext().getResponse().addHeader("Set-Cookie", "CFTOKEN=#session.CFTOKEN#;path=/;HTTPOnly");
    

    【讨论】:

    • 现在这看起来可行。我要到星期一才能测试。
    • 我用你的例子更新了功能代码。必须做出改变。
    • 好的。我的生产代码中确实设置了路径和其他值,但为了简单起见,我将其省略了,它对我来说工作正常。
    • 杰里米没问题。感谢您提供此解决方案!
    【解决方案2】:

    对于会话 cookie,有一种更简单的方法。

    启用服务器范围的 HttpOnly 会话 cookie

    ColdFusion 9.0.1 更新添加了一个服务器范围的设置来添加 ColdFusion 创建的所有会话 cookie 的 httponly 属性(例如 作为 CFID 和 CFTOKEN cookie,或 JRun 上的 JSESSIONID cookie)。到 如果您正在运行 JRun J2EE 安装或 多服务器安装,必须编辑jvm.config,否则可以 从 CF 管理员启用此设置。如果您正在运行 JRun 以外的 J2EE 服务器请查阅您的文档以获取 适当的设置。支持 Servlet 3.0 的 J2EE 服务器 规范可以指定 真的 在 /WEB-INF/web.xml 文件中。

    http://www.adobe.com/devnet/coldfusion/articles/coldfusion-securing-apps.html

    【讨论】:

    • 谢谢亨利。我不知道我可以在 Coldfusion Administrator 中处理这个问题。我们有其他人管理我们的服务器,因此在以后的安装中,我将把它作为一项要求,在我可以访问的那些上进行更改,并将其作为 Application.cfc 条目作为我无法访问的条目。
    • 亨利,我用我正在使用的东西更新了答案......看看。如果您看到任何有关它的信息,请告诉我。
    • @Frank 你应该打开sessionmanagement,关闭setclientcookie,并自己设置session.cfidsession.cftoken 到cookie,而不用createUUID() 调用生成任何你自己的.
    • 我已经设置了 sessionmanagement 和 setclientcookie。对于我在 cftoken 上的 UUID,我将翻转管理设置并按照您在此处所说的操作并使用显式设置提取该 if 语句。再次感谢亨利。
    • @FrankTudor 很好,所以如果它有效,我认为你应该将 Jeremy 的答案标记为正确答案
    【解决方案3】:

    您可以在 onsessionstart 函数内的 application.cfc 中使用此代码。

              <cfcookie name="CFID" value="#session.cfid#" httponly="true">
              <cfcookie name="CFTOKEN" value="#session.cftoken#" httponly="true">
    

    没有办法在 cfscripts 中设置它。 cf9 中的脚本形式不支持 cfcookie。 CF10 中添加了应用程序设置中的标志来解决此问题,但是,CF11 将在脚本中完全支持它。不幸的是,我认为您将不得不放弃功能的统一代码。除非您有权访问您的 CFIDE/管理员。您可以添加一个 java 参数以在服务器范围内打开它。将此添加到您的 JVM 配置中

    -Dcoldfusion.sessioncookie.httponly=true
    

    所有这些都在这里详细介绍http://www.petefreitag.com/item/764.cfm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2011-12-24
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多