我们知道,为了防CSRF攻击,WordPress使用随机数Nonce来验证用户操作,默认设置下,WordPress生成的Nonce 有效期是24小时,在Nonce开始的24小时内,某个操作的Nonce值都是一样的。

有时候这个nonce是输出的页面中的(比如使用 wp_nonce_field() 函数生成的表单字段),如果我们使用了静态页面缓存,这个 Nonce 值会和该页面中的其他 HTML 一起被缓存起来。如果静态页面缓存的有效期大于 24 小时。那么 24 小时后,页面中缓存的 Nonce 就会失效。再使用这个 Nonce 值去验证请求的时候,就会导致验证失败。

怎么解决这个问题呢?有两个办法。

缩短页面缓存有效期

最简单的办法就是缩短静态页面缓存有效期,把页面缓存的过期时候设置为小于 24 小时的数字。

不缓存包含 Nonce 值的页面

大部分缓存插件都提供了设置或者 Hooks,允许我们从缓存系统中排出某个页面。我们只要把包含 Nonce 值的页面从缓存中排除掉,不让系统缓存这个页面,就可以解决这个问题了。