With the new version released today for vBulletin 3.6.10 and 3.7.0 RC4, a new protection against Cross Site Request Forgery (CSRF) has been introduced. This new protection might influence the coding in modifications.
Scott MacVicar took the time to compile a short explanation on this new protection for the coders on vBulletin.org:
Changes for CSRF protection with third party modifications
Cross Site Request Forgery (CSRF) involves taking advantage of the stateless nature of HTTP, there are no ways to ensure the exact origin of a request, its also not possible to detect what was actually initiated by a user and what was forced by a third party script. A token was added to the latest version of each of the vBulletin products, with the release of 3.6.10 and 3.7.0 RC4 it is no longer possible to submit a POST request directly without passing in the known token.
The addition of a security token for each POST request removes the ability for a remote page to force a user to submit an action. At the moment this protection will only apply to vBulletin files and third party files will need to opt into this protection and add the appropriate hidden field. This was done to preserve backwards compatibility.
Adding Protection to your own files
To opt your entire file into CSRF protection the following should be added to the top of the file under the define for THIS_SCRIPT.
PHP Code:
define('CSRF_PROTECTION', true);
With this change all POST requests to this file will check for the presence of the securitytoken field and compare it to the value for the user, if its wrong an error message will be shown and execution with halt.
If this value is set to false then all CSRF protection is removed for the file, this is appropriate for something that intentionally accepts remote POST requests.
You should always add this to your file, even if you don't think the script is ever going to receive POST requests.
An absence of this defined constant within your files will result in the old style referrer checking being performed.
Template Changes
The following should be added to all of the forms which POST back to vBulletin or a vBulletin script. This will automatically be filled out with a 40 character hash that is unique to the user.
The above example would exempt both example.php?do=action_one and example.php?do=action_two from the CSRF protection, if the CSRF_SKIP_LIST constant is defined with no value then it will exempt the default action.
If the skip list needs to be changed at runtime is it available within the registry object, using the init_startup hook the following code would be used to exempt 'example.php?do=action_three'.
PHP Code:
if (THIS_SCRIPT == 'example') { $vbulletin->csrf_skip_list[] = 'action_three'; }
The bad part is that not all forms have value="$session[sessionhash]" in them in some of the hacks out there. I basically look for <form and then add the line anywhere underneath that where there is a <input type="hidden" line.
what about this? I have a mod that doesn't have what is in bold...
I mean, there is no <input type="hidden" line neither
Can I just add the security token below the opening form tag "<form>"?
I find it hard to believe that, in the final release candidate, Jelsoft would throw a monkey wrench like this into the mix and create a nightmare for all of their current customers who aren't programmers.
Isn;t there any kind of search and replace mod that one of you can cook up to repair the damage done by this security token B.S.? It looks like the terrorists have finally won!
I find it hard to believe that, in the final release candidate, Jelsoft would throw a monkey wrench like this into the mix and create a nightmare for all of their current customers who aren't programmers.
Isn;t there any kind of search and replace mod that one of you can cook up to repair the damage done by this security token B.S.? It looks like the terrorists have finally won!
I too am frustrated at this because I was thinking going gold meant ready to go. Now I have end users who are leaving my forums because of this. I spent 2 hours searching and replacing and now find out that anything with form needs it too Is there a hack or something out there that will do this automatically this is quite a drag.
The bad part is that not all forms have value="$session[sessionhash]" in them in some of the hacks out there. I basically look for <form and then add the line anywhere underneath that where there is a <input type="hidden" line.
thank you for this advise!!!! this fixed my itrader issue. two or 3 of the itrader templates did not have "sessionhash."
Forms are not equal to templates but some templates have forms in them.
A form is anywhere your users can submit data. If you have modifications that submit data and cannot update their templates then you need to post for support in the modification thread.
It isn't hard to find out where this needs to go.
In your Admin CP under Styles & Template select Search In Templates...
Search for: value="$session[sessionhash]"
In every template this occurs in add this line directly after the line containing the above, if it doesn't exist already:
<input type="hidden" name="securitytoken" value="$bbuserinfo[securitytoken]" />
Save the template.
thank you wayne for putting this in english i just followed your instructions and then the problem was solved