我们知道,为了防CSRF攻击,WordPress使用随机数Nonce来验证用户操作,默认设置下,WordPress生成的Nonce 有效期是24小时,在Nonce开始的24小时内,某个操作的Nonce值都是一样的。
有时候这个nonce是输出的页面中的(比如使用 wp_nonce_field() 函数生成的表单字段),如果我们使用了静态页面缓存,这个 Nonce 值会和该页面中的其他 HTML 一起被缓存起来。如果静态页面缓存的有效期大于 24 小时。那么 24 小时后,页面中缓存的 Nonce 就会失效。再使用这个 Nonce 值去验证请求的时候,就会导致验证失败。
怎么解决这个问题呢?有两个办法。
缩短页面缓存有效期
最简单的办法就是缩短静态页面缓存有效期,把页面缓存的过期时候设置为小于 24 小时的数字。
不缓存包含 Nonce 值的页面
大部分缓存插件都提供了设置或者 Hooks,允许我们从缓存系统中排出某个页面。我们只要把包含 Nonce 值的页面从缓存中排除掉,不让系统缓存这个页面,就可以解决这个问题了。
6 thoughts on “WordPress页面静态缓存时间过长导致的 Nonce 失效的问题”
先六个坑
错字。
多谢提醒!
wp super cache的话,可以启用动态缓存,页面中指定的字符,可以在每次打开都自定义替换。我就是这么用的。
谢谢分享,有机会试试。
缓存插件里可以直接设置缓存清除时间,我一般就设成24h
还有其他方法吗,坐等填坑