WP REST API-NONCE即使在注销后也会传递wp_Verify_Nonce

时间:2017-08-25 作者:Daniele Squalo

我正在使用WP REST API和AngularJS创建一个单页应用程序。在使用nonce解决问题后this question, 现在我面临着另一个问题。为了测试添加字段并使其免受未登录用户的影响,我尝试创建一个自定义字段,该字段公开wp_verify_nonce

if (isset($_SERVER[\'HTTP_X_WP_NONCE\'])) {
    $nonce = $_SERVER[\'HTTP_X_WP_NONCE\'];
    $nonce_verified = wp_verify_nonce($_SERVER[\'HTTP_X_WP_NONCE\'], \'wp_rest\');
}

return array(\'nonce\' => $nonce,
             \'nonce_verified\' => $nonce_verified);
当然,这是一种考验,并将继续下去。一旦暴露,也会暴露nonce_verified. 此时,我尝试登录/注销一个用户,并要求该端点和用户/我。但碰巧的是,我的nonce总是通过登录或注销的用户进行验证。执行此操作时,Nonce本身会发生变化;尽管如此,当注销时,它的整个生命周期都是一样的。

为了创建nonce,我使用了一个本地化的代码,就像我之前的问题一样:

wp_localize_script(\'angularjs\', \'params\', array(
    \'nonce\' => wp_create_nonce(\'wp_rest\'),
));
这是通过javascript传递的,正如我在关于AngularJS的教程中看到的。虽然此nonce得到验证,但查询到users/me 如预期,未记录时会导致403。

我的理论是,正在为未登录的用户创建一个nonce,因此总是有一个有效的nonce可用。我应该使用is_user_logged_in()? 或者我应该把临时创作挂在什么地方?非常感谢。

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

未登录用户不使用nonce的真正原因是,这会给他们的使用带来无意义的负担,因为他们需要在nonce过期时刷新页面,而他们知道需要这样做的唯一方式是当某些东西不起作用时。

可能没有理由避免生成它,但如果您预计您的“应用程序”将被使用/打开超过12个小时(即用于计算wordpress nonce的“勾选”时间),那么您需要有一种自动刷新nonce的方法(对于登录用户来说也是一个好主意),或者首先避免使用它。

SO网友:bynicolas

WordPress nonce不是真正的nonce,它们在12到24小时内保持有效,并将返回SAME 的值all visitors (未登录用户)的网站。因此,如果您希望每个操作都有一个新的数字,或者您正在应用程序中处理来宾用户,那么您不应该依赖WP nonces来进行安全措施。

我在这里详细解释了这是如何工作的:https://www.bynicolas.com/code/wordpress-nonce/

您可能还想看看这个项目https://github.com/calevans/wp-simple-nonce 如果希望向项目添加真正的nonce

EDIT来自法典https://codex.wordpress.org/WordPress_Nonces

不应依赖nonce进行身份验证或授权、访问控制。

结束