tags:

views:

84

answers:

1

I've just seen Doctype's episode on CSRF.

In it they say that the best prevention for CSRF is to create a token from some user unique data (e.g. hash a session ID) and then POST that along with your request.

Would it be less secure to generate a difficult to guess value (e.g. GUID) and store that as a session variable and put it into the page as a hidden field?

Each time the page is loaded the value would change, but the test of the POSTed data would come before that.

This seems to me to be just as secure. Am I wrong?

+2  A: 

Where the token comes from is probably not that interesting as long as it is not guessable or determinable in any way. But watch out on generating a new token on each request as this will mean that your site will not work for a user who opens two or more browser tabs to your site. By sticking to one token value for the duration of a user's session, you can circumvent this problem.

Changing the token every request is arguably more secure. But the penalty could well be considered too high. Like almost anything when it comes to security, you often find you have to make trade-offs against the ease of the user's experience -- find me one user that enjoys CAPTCHAs!. Finding the right balance for your application and your users is important- to both your security and your usability.

There's some good reading on CSRF (and much more) over at the Open Web Application Security Project

Also bear in mind that if you have just one cross-site scripting vulnerability on a token-protected page, then your CSRF token is now useless. See also the OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet.

Cheekysoft
I hadn't hought about muliple tabs. Thanks Cheekysoft!
Matt Ellen