apiFetch security

时间:2020-11-15 作者:Tom

我正在编写一些更新选项的代码,使用update_option 使用REST API和apiFetch。

我习惯于使用AJAX来完成这项工作,我会在请求中将nonce传递给我的PHP函数,并检查当前的用户功能。

使用RESTAPI和apiFetch感觉比使用AJAX好得多,但我觉得在安全性方面我缺少了一些东西。

以下是我的想法:

register_rest_route(
    $namespace,
    \'/update_settings/\',
    array(
        \'methods\'             => WP_REST_Server::EDITABLE,
        \'callback\'            => array( $this, \'update_settings\' ),
        \'permission_callback\' => array( $this, \'update_settings_permission\' ),
    )
);
我的permission_callback 如下所示:

public function update_settings_permission() {
    if ( ! current_user_can( \'manage_options\' ) ) {
        return $this->error( \'user_dont_have_permission\', __( \'You do not have permission to change options.\' ) );
    }

    return true;
}
我的update\\u settings函数如下所示:

public function update_settings( WP_REST_Request $request ) {
    $new_settings = $request->get_param( \'settings\' );

    if ( is_array( $new_settings ) ) {
        $current_settings = get_option( \'my_options\', array() );
        update_option( \'my_options\', array_merge( $current_settings, $new_settings ) );
    }

    return $this->success( true );
}
然后请求本身就相当标准:

apiFetch( {
    path: \'namespace/v1/update_settings\',
    method: \'POST\',
    data: {
        settings: this.state.settings,
    },
} ).then( ( result ) => {
    // all done.
} );
这一切都很完美,但似乎太简单了。我是不是应该在什么地方打发时间?apiFetch似乎有一些包含nonce的中间件-这是默认情况下为我们完成的吗?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这一切都很完美,但似乎太简单了。我是不是应该在什么地方打发时间?

apiFetch似乎有一些包含nonce的中间件-这是默认情况下为我们完成的吗?

如果端点需要nonce和apiFetch 没有提供,那么apiFetch 不起作用。使用基于cookie的身份验证的已验证端点需要nonce。

记住,REST API身份验证和安全是服务器端的。apiFetch 是客户端。apiFetch 无法神奇地绕过服务器端检查,除非您故意添加这样的绕过。如果你有,你就会知道这件事,你也不会问这个问题,因为这需要相当多的努力和意愿。

这里有安全问题,但它们与apiFetch. 使用apiFetch 没有降低您的安全性。