[wp-hackers] Rethinking check_admin_referer()

Owen Winkler ringmaster at midnightcircus.com
Mon Apr 17 13:44:14 GMT 2006


Mark Jaquith wrote:
> Sorry for the double post, but please see this thread from last year 
> that died on the vine:
> 
> http://comox.textdrive.com/pipermail/wp-hackers/2005-August/002391.html
> 
> Several developers seemed to be in favor of the idea, including Matt and 
> Owen, so with a couple of +1s to let me know that your opinion on the 
> matter hasn't changed, and I'll proceed with the patch as soon as I have 
> time.

I still think this is a good idea, but...

This is going to kill a lot of plugins; pretty much anything that uses 
an options page.  So what can be done to mitigate that?

My first thought is that the real problem around which all of this is 
base is executing actions in the admin without performing a 
confirmation.  For example, you click on an unobtrusive link on a 
foreign site that sends you back to your own site's admin to delete post 
#327.  If there is no confirmation for this action, then your site is 
vulnerable.

So the first thing we should be doing is confirming every action that 
could be accessed externally.  This is really freaking annoying, as I've 
noticed with deleting moderated comments from email in 2.1, since I 
didn't have to confirm those in < 2.1 and now I do.

Supposing we could add the action-based nonces to URLs as Mark 
describes, we could avoid some of that pain.

Perhaps a generic check could be performed in admin.php that looks for 
the nonce, and if not found, redirects to a generic confirmation page. 
The confirmation page could build a $_POST/$_GET form (based on the 
original request) that uses the originally submitted values.  It would 
simply ask, "Are you sure you want to do this?"  And if the user clicks 
"OK" then it submits the form on to the originally intended script with 
an appropriate nonce.

That would mitigate some of the plugin breakage, since any plugin that 
didn't build the nonce into its own requests would pass through this 
confirmation.  It also saves from having to immediately add the nonce 
building code to every admin page.  And if this check is centralized, 
then the admin pages and plugins need only worry about appending it to 
their form input, not necessarily checking for it themselves.  (Although 
exposing the function that does so would be useful for plugins with Ajax 
requests that wouldn't pass through that verification code.)

I don't see a way that external sites can scrape the nonces from the 
admin pages, since you would need to be logged in to do that.  It would 
be especially difficult if the nonces were encoded by user id, because 
using someone else's "delete all posts" link would force a confirmation 
on you.  So even if someone else scraped their nonce from your site's 
admin pages, their links would still require a confirmation from you, 
since you're not using your own unique nonce.

Owen



More information about the wp-hackers mailing list