Setting up HTTPOnly Session Cookies for ColdFusion
Internet Explorer pioneered a great security feature for cookies called HTTPOnly, when this flag is set the browser does not allow JavaScript to access the cookie. Now that all modern browsers support this flag it can reduce the risk of session hijacking due to cross site scripting. For that reason many security auditors will take marks off if you are not using it for your session identifier cookies (eg cfid, cftoken, and jsessionid).
I recently updated my ColdFusion Security Scanner, hackmycf.com to check for the omission of HTTPOnly session cookies. It now provides a warning if the cfid, cftoken, or jsessionid cookies do not set the HTTPOnly flag. We now also offer a subscription service which will scan your server automatically on a daily, weekly, monthly or quarterly basis.
ColdFusion 9 also introduced an attribute on the cfcookie tag called httponly which you can set to a boolean value. Prior to CF9 you can still create HTTPOnly cookies with ColdFusion but you have to use cfheader instead of cfcookie to write the cookies.
If running ColdFusion 9.0.1
ColdFusion 9.0.1 update added support by a java system property called coldfusion.sessioncookie.httponly you can turn this on by editing the jvm.config and adding -Dcoldfusion.sessioncookie.httponly=true or if you are running Standalone you can add this in the ColdFusion Administrator.
If Running CF 9.0 or greater
If you have not upgraded to 9.0.1 yet, or would rather solve this issue in your code, here’s an example Application.cfc file you could use:
<cfcomponent>
<cfset this.sessionmanagement = true>
<cfset this.setclientcookies = false>
<cffunction name="onSessionStart">
<cfcookie name="CFID" value="#session.cfid#" httponly="true">
<cfcookie name="CFTOKEN" value="#session.cftoken#" httponly="true">
</cffunction>
<cfcomponent>
If Running CF 8 or Lower and using Application.cfc
<cfcomponent>
<cfset this.sessionmanagement = true>
<cfset this.setclientcookies = false>
<cffunction name="onSessionStart">
<cfheader name="Set-Cookie" value="CFID=#session.CFID#;path=/;HTTPOnly">
<cfheader name="Set-Cookie" value="CFTOKEN=#session.CFTOKEN#;path=/;HTTPOnly">
</cffunction>
<cfcomponent>
Make sure you have setclientcookies = false specified.
If Using Application.cfm
If you are still using an Application.cfm file, you can use the following:
<cfapplication setclientcookies="false" sessionmanagement="true" name="test">
<cfif NOT IsDefined("cookie.cfid") OR NOT IsDefined("cookie.cftoken") OR cookie.cftoken IS NOT session.CFToken>
<cfheader name="Set-Cookie" value="CFID=#session.CFID#;path=/;HTTPOnly">
<cfheader name="Set-Cookie" value="CFTOKEN=#session.CFTOKEN#;path=/;HTTPOnly">
</cfif>
If using J2EE Session Cookies (jsessionid)
If you are using CF9.0.1 or greater use the java system property described above.
If you are using CF9.0 or lower, then you can edit the jrun-web.xml file located in WEB-INF as described here to enabled HTTPOnly cookies.
Jason Dean has also come up with a way to do this in onSessionStart as well.
Consider Setting The Secure Flag
If you have SSL, also consider setting the secure flag on your cookies. When the browser is given a cookie with the secure flag it only sends the cookie over a HTTPS connection.
Tweet
add to del.icio.us
| Tags: httponly, cookies, session, cfid, cftoken, jsessionid, security
Related Entries
- Client Variable Cookie CFGLOBALS Includes Session Ids - July 14, 2011
- Firefox Now Supports HttpOnly Cookies - July 19, 2007
- J2EE Session Cookies on ColdFusion / JRun - February 8, 2010
- CFLogin Security Considerations - December 10, 2009
Trackbacks
Comments
I have been relying on ajax passing on the CFID and token from the main session through async requests.
-Brian
-Brian
http://www.jeffryhouser.com/index.cfm/2010/11/10/Setting-HTTPOnly-and-Secure-for-the-ColdFusion-Session-cookies
And from this I derived this which seems to work well. Tell me if you see any issues with this and leaving 'setclientcookies=true'.
<cfset this.clientmanagement = true /> <cfset this.setclientcookies = true />
<cffunction name="onSessionStart" access="public" returntype="void" output="false"> <cfset var LOCAL = {} />
<cfset LOCAL.cookie = ";domain=" & cgi.http_host & ";path=/;HTTPOnly;" />
<cfif StructKeyExists(cgi, "https") and cgi.https is "on"> <cfset LOCAL.cookie &= "Secure;" /> </cfif>
<cfset LOCAL.cfidCookie = "cfid=" & session.cfid & LOCAL.cookie /> <cfset LOCAL.cftokenCookie = "cftoken=" & session.cftoken & LOCAL.cookie />
<cfcookie name="cfid" expires="now" /> <cfcookie name="cftoken" expires="now" />
<cfheader name="Set-Cookie" value="#LOCAL.cfidCookie#"> <cfheader name="Set-Cookie" value="#LOCAL.cftokenCookie#"> </cffunction>
That may only be required if using Application.cfm
http://blog.fusedevelopments.com/2011/03/coldfusion-9-hotfix-1-causes-session.html
I believe your suggestion for CF 9.0.1 is incorrect.
Your sussestion is that using -Dcoldfusion.sessioncookie.httponly=true will simply make jsessionid httponly.
However, what I believe it is doing is setting any session only cookies to httponly.
The main issue is the definition of seesioncookie. Instead of being "cookies that define the users session", I believe the real definition is "cookies that are set to expire at the end of the browser session"
So if you currently have code like "<cfset Cookie.ShowTab = 0>", and then have javascript that works with that cookie, then your code will break because the ShowTab cookie is httponly and not available to javascript.
Your described behaviour appears correct because jsessionid is a end-of-session cookie.
I beleive you shouldn't use coldfusion.sessioncookie.httponly unless you have reviewed the code for all sites on the server.
Possible workarounds are to always set a date expiry, or set the cookie in JS only and make the CF code allow for the cookie to not exist yet.
I haven't tested with cfcookie, but expect the same behaviour.
Hopefully CF10 will have httponly and secure settings for the jsessionid cookie as part of Application.cfc/cfapplication.
At the end of this post you mention setting the "secure" flag on your cookies. Is that eluding to it being possible to set that as a JVM config argument as well or is this only available in the jrun-web.xml?
@Ted - Glad you found it useful.
I'm not prepared to uninstall the patches to retest, but anyone reading this should disregard my previous comments if they are fully patched up.
Post a Comment
Recent Entries
- Nginx redirect www to non www domain
- HashDOS and ColdFusion
- HackMyCF Updated for APSB11-29 Security Hotfix
- Adobe eSeminar on FuseGuard
- Determining Which Cumulative Hotfixes are Installed on ColdFusion
- Adding Two Factor Authentication to ColdFusion Administrator
- ColdFusion Developer Week at Adobe.com
- Bug Loading Scripts for CFFileUpload and CFMediaPlayer





