我正试图将我的cookie CFIDE和CFTOKEN设置为仅在Coldfusion 9…中为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.CFID
和session.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)。
您可以使用PageContext对象在cfscript:中设置cookie
getPageContext().getResponse().addHeader("Set-Cookie", "CFID=#session.CFID#;path=/;HTTPOnly");
getPageContext().getResponse().addHeader("Set-Cookie", "CFTOKEN=#session.CFTOKEN#;path=/;HTTPOnly");
对于会话cookie,有一种更简单的方法。
启用服务器范围的HttpOnly会话cookie
ColdFusion 9.0.1更新添加了服务器范围的设置,以添加httponly属性到ColdFusion创建的所有会话cookie(例如作为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
您可以在onsessionstart函数内部的application.cfc中使用此代码。
<cfcookie name="CFID" value="#session.cfid#" httponly="true">
<cfcookie name="CFTOKEN" value="#session.cftoken#" httponly="true">
没有办法在cfscript内部设置此项。cf9中的脚本形式不支持cfcookie。CF10的应用程序设置中添加了一些标志来解决这个问题,但是,CF11将在脚本中完全支持它。不幸的是,我认为您将不得不放弃统一的功能代码。除非您有权访问您的CFIDE/管理员。您可以添加一个java参数来在服务器范围内启用它。将其添加到JVM配置中
-Dcoldfusion.sessioncookie.httponly=true
所有这些都在这里详细介绍http://www.petefreitag.com/item/764.cfm