[nycphp-talk] ColdFusion Question
shiflett at php.net
Thu Feb 20 10:22:57 EST 2003
--- Hans Zaunere <hans at nyphp.org> wrote:
> OK, no comments please :)
Developing in ColdFusion can be fun. I lead a team of ColdFusion developers for
about three years and enjoyed it very much. My only complaint was that it felt
more like writing HTML than it did programming. :-)
> I'm now incharge of CF development, and while things have been moving "well"
> there's one issue I can't seem to get past easily.
I actually wrote a specification for something called Cross-Domain Session
Management (CDSM) once upon a time, and there are some major Web sites that are
using it. It is basically a method of doing exactly what you are trying to do
1. More secure than passing a single session ID on the URL.
2. Completely reliable - no legitimate user will be impacted negatively.
First, I would like to suggest that you do not try to determine a MAC address
or do anything below the HTTP protocol layer. It can offer more security to dig
into TCP/IP or deeper, but point 2 above will be lost (so ignore this advice if
that is not a concern).
Consider an HTTP request that looks like this:
User-Agent: Mozilla/5.0 Galeon/1.2.6 (X11; Linux i686; U;) Gecko/20020830
Accept-Encoding: gzip, deflate, compress;q=0.9
Accept-Language: en-us, en;q=0.50
Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66
There are a bunch of HTTP headers available as $_SERVER['foo']. You can use
these combined with an extremely small window of time (I recommend no more than
60 seconds, preferably more like 30 or less) to make impersonation (session
hijacking) extremely difficult.
Using a random collection of the HTTP headers, create a fingerprint (while the
user is on your site, of course) of the user agent. If you md5 the User-Agent
and Accept headers, this will suffice. However, to add some integrity
protection, you should include the timestamp you create (next step) in your MD5
Now create a Unix timestamp of the current time in GMT.
Create a string like this:
The ua is the md5 of the timestamp appended to the User-Agent header appended
to the Accept header.
Encrypt this string using a symmetric algorithm. I built a triple DES CFX tag
for ours, so we also added the initialization vector to the above string. The
receiving site just needs to be able to decrypt the string to get the ua and
In order to only allow for a tony window of opportunity, you must create a
launch page (I'll just use XXX for the CDSM token):
<cflocation url="http://#url.domain#/land.cfm?cdsm_token=XXX" addtoken="no">
(forgive me if my CF syntax is wrong; it's been a while)
So, all links to the external site will be links to your launch.cfm page, and
you will pass the external domain on the URL:
Alternatively, you can of course modify this example to allow the other site to
redirect the user to somewhere else in their site after CDSM authentication, so
that you can add the final destination to your token and allow for links to
anywhere on that other site.
1. What if someone is using a browser that doesn't have a User-Agent header,
Accept header, etc?
It won't matter, as long as both you and the receiving site use NULL or the
empty string when a header is absent. If you're programming in the same
language, don't worry about it, because this will be consistent.
2. Can I use the Referer header to make sure the user is coming from the right
Yes, you can even add what the Referer should be in the ua variable. However,
if you deny access to those who fail to pass the correct Referer header, you
can negatively impact legitimate users.
3. Is this 100% secure?
No, but it does not negatively impact the legitimate users and makes it damn
hard for the bad guys. :-)
Hope that helps at least give you some thoughts.
More information about the talk