禁用对REST API端点的外部访问

时间:2017-02-10 作者:Cyclonecode

我正在使用WP REST API,并设置了一个路由,用于在从主页提交表单时创建新用户。以下是如何设置端点:

add_action(\'init\', \'test_init\');

function test_init() {
   // register the route
   add_action(\'rest_api_init\', function () {
     register_rest_route( \'test/api/v1\', \'/user/add\', array(
         \'methods\' => \'POST\',
         \'callback\' => \'test_add_user\',
     ));
   });
}

function test_add_user() {
   // make sure all data is available
   if (!isset($_POST[\'firstname\'], 
              $_POST[\'surname\'],
              $_POST[\'email\'],
              $_POST[\'password\'])) {
      exit;
   }

   // check so the user not already exists
   if (username_exists($_POST[\'firstname\'])) {
      exit;
   }

   // create a new user
   $user = array(
      \'user_pass\' =>  $_POST[\'password\'],
      \'user_login\' => $_POST[\'firstname\'],
      \'user_email\' => $_POST[\'email\'],
      \'first_name\' => $_POST[\'firstname\'],
      \'last_name\' => $_POST[\'surname\'],
      \'role\' => \'author\'
    );

    $user_id = wp_insert_user($user);

    // return the id of the created user
    echo json_encode(array(\'id\' => $user_id));
    exit;
}
我想知道的是如何最好地防止外部访问此路线?我只希望来自主页上实际表单的数据能够将数据发布到此端点。

我试图在回调中检查原点,但我不确定这是否是正确的方法:

function test_add_user() {
   // only allow request from the same origin
   if (get_http_origin() != home_url()) {
     exit;
   }

   ...
}
我在想是否可以使用nonces或类似的东西?

也许我还应该提到,提交表单的用户没有登录,因此我无法使用基于cookie的身份验证或类似验证。

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

我建议不要为此使用WP REST API,因为它是在主页上使用的,而不是任何远程应用程序/服务
REST API应该授予远程开发人员对任何已公开可用数据的访问权限
因为您不提供任何公共数据,而是从主页注册用户,所以Ajax可能是一个不错的选择
来自官方WordPress REST APIHandbook

WordPress REST API为WordPress数据类型提供API端点,允许开发人员通过发送和接收JSON(JavaScript对象表示法)对象与站点进行远程交互。

然而,这并不是它的唯一用例

我建议为此使用Ajax

在Ajax请求中包含nonce。

用钩子钩住Ajax请求处理程序wp_ajax_nopriv 行动

这确保用户未登录,并且nonce确保表单是由WordPress生成的<已有用于Ajax用户注册的插件,高级免费,WordPress插件库将是一个良好的开端<我希望这种替代方法能有所帮助。

相关推荐

wordpress admin security

我用不同的工具扫描我的网站,但它没有显示恶意脚本。但当我在管理仪表板中看到时,我在body标签下面看到了奇怪的方形符号。我试图检查管理索引文件,根索引文件,但什么都没有。有人放了这个脚本。而且,当我试图采取备份它不允许我采取。使用BackupFordPress插件。然而,所有其他的事情都在运行,但在管理方面仍然存在一些问题。如何检测和删除此项。