[wp-trac] [WordPress Trac] #50422: Prevent Browser Caching From Getting Involved With wp_redirect and wp_safe_redirect (Leaving the Browser to Purely Honor the Redirect Code Used)

WordPress Trac noreply at wordpress.org
Thu Jun 18 16:51:16 UTC 2020


#50422: Prevent Browser Caching From Getting Involved With wp_redirect and
wp_safe_redirect (Leaving the Browser to Purely Honor the Redirect Code
Used)
-------------------------+-------------------------------------
 Reporter:  KZeni        |      Owner:  (none)
     Type:  enhancement  |     Status:  new
 Priority:  normal       |  Milestone:  Awaiting Review
Component:  General      |    Version:  5.4.2
 Severity:  normal       |   Keywords:  needs-testing has-patch
  Focuses:               |
-------------------------+-------------------------------------
 Currently, {{{wp_redirect}}} (and therefore {{{wp_safe_redirect}}} as well
 since that uses {{{wp_redirect}}}) can be cached by web browsers depending
 on a site's browser caching rules. For example, W3 Total Cache has browser
 caching that one would certainly want to utilize for improved site
 performance, but then doesn't really have the means to prevent this
 potential problem where a redirect then gets cached by the browser (even
 if it's a 302 redirect). W3TC is just one example, but browser caching can
 be implemented in any number of ways which this then can be a problem.

 I came across this with a plugin and proposed a patch to the plugin per
 https://wordpress.org/support/topic/proposed-bugfix-prevent-login-
 redirect-from-browser-cache-rules/, but I'm wondering why the fix for this
 isn't part of WordPress' core so that plugins & developers in general
 don't need to specifically add this to prevent an issue that can come
 about given the right circumstances (with the fix being rather simple &
 straightforward, from what I can tell.)

 In short, having {{{nocache_headers();}}} before the redirect happens has
 the redirect still honored as it was set while removing the potential
 undesired effect of it being cached by the web browser (ex. trying to view
 a page that needs you logged in to view it has a plugin redirect to the
 login page, but then that 302 redirect was cached by the browser so the
 user is still redirected to the login when trying to visit that page even
 after they've already logged in, and it can really happen with any
 redirect that should be honored as being temporary that was then cached as
 the page's result by the browser when it shouldn't be [translation plugins
 have also encountered this in the past as well when switching between
 languages for pages via a redirect, and I'm sure there's more instances of
 this.])

 ----

 Yes, currently developers can prevent this themselves by implementing
 {{{nocache_headers();}}} before their {{{wp_redirect}}} and/or
 {{{wp_safe_redirect}}} (I've made sure to document this as such at
 https://developer.wordpress.org/reference/functions/wp_redirect/#comment-3973
 and
 https://developer.wordpress.org/reference/functions/wp_safe_redirect/#comment-3974,
 respectively [which I imagine both of these notes should be removed
 if/when this gets implemented natively]), but I'm wondering why that
 should be necessary. Would there really be any downside of having
 {{{wp_redirect}}} trigger {{{nocache_headers();}}} as part of that
 function natively so it just works more reliably without added code and/or
 developers potentially not knowing to do this which then results in
 problematic behavior?

 At that point, things like the {{{auth_redirect}}} function (and possibly
 others) can be cleaned up to not need to include {{{nocache_headers();}}}
 before their redirect. Meanwhile, {{{wp_get_nocache_headers();}}} (used by
 {{{nocache_headers();}}}) checks to see if headers have already been sent
 or not & also honors the existing headers while just enforcing specific
 ones so those that have this applied twice (ex. after this is included
 natively as part of {{{wp_redirect}}} while they still have it in their
 own implementation before this was done) shouldn't have any negative
 effects.

 ----

 **- The Proposed Patch -**
 This simply has {{{nocache_headers(); // Prevent browser caching of page
 with the redirect header (browser should still honor the redirect status
 code)}}} before the {{{header( "Location: $location", true, $status );}}}
 snippet in the {{{wp_redirect}}} function within ''wp-
 includes/pluggable.php'', and then has a minor optimization of removing
 {{{nocache_headers();}}} from the {{{auth_redirect}}} function in that
 same file since that's no longer needed (the {{{wp_redirect}}} later in
 the function now takes care of this. I've attached a patched version of
 pluggable.php from WP 5.4.2 with these 2 changes.

 I filed this as an enhancement since it's not really a bug within the code
 being fixed as much as it is preventing bugs made by plugin & other
 developers (so it still is fixing bugs within the WordPress ecosystem
 [just going to the core of the problem rather than having to fix the issue
 with each instance where this came up as a result of the core code not
 taking care of this itself yet.])

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/50422>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list