问题描述

我的问题是:当我编写一个 AJAX 函数时,我可以使用一个单独的文件来编写它。我可以将 wp-load.php 包含在该文件中,并使用 WP 核心功能。我知道这是错的。你能告诉我有多糟糕?这是一个很大的安全隐患吗?我有什么安全的风险和劣势?

最佳解决方案

这是非常糟糕的,一个重大的安全漏洞,你将不得不面对这些问题:

  • 即使您的插件被停用,或者您切换主题,您的端点将始终工作

  • 您的端点将在多站点安装的所有站点上处于活动状态,而不仅仅是您打算使用的端点,这可能导致端点在不需要的位置使用

  • 该文件将变得脆弱,移动您的插件文件夹,或插入 mu-plugins 插件将导致端点给 500 个致命错误

  • 您将需要自己实现所有的身份验证和验证

  • 缓存插件将无法与您的端点进行交互,从而减缓常见请求

  • 所述端点可以接受任何东西,它可以返回任何东西

说主题和插件中的独立端点是一个安全风险,无论是 AJAX 处理程序还是表单处理程序,甚至是图像的独立文件 (timtumb 这样做,甚至原始的开发人员都因为其安全声誉)

您可以使用更好的 WP AJAX API,但需要您自己实施任何身份验证或清理检查,并有一些怪癖。它也没有提供任何结构,如同一个标准端点,它可以接收任何东西并返回任何东西 (如果它完全返回) 。

相反,使用 REST API 与 register_rest_route,它更容易使用,有更少的怪癖,并为您处理身份验证。它还给你更友好的 URL 和命名空间,例如:

function tomjn_rest_test() {
        return "moomins";
}
add_action( 'rest_api_init', function () {
        register_rest_route( 'tomjn/v1', '/test/', array(
                'methods' => 'GET',
                'callback' => 'tomjn_rest_test'
        ) );
} );

你可以看到:

https://tomjn.com/wp-json/tomjn/v1/test

有了这个我可以做一些事情:

  • 指定用户必须登录,以及他们需要什么才能做到这一点

  • 指定参数

    • 分别指定每个参数的类型和消音器

    • 指定是否需要它们

  • 指定端点是用于读写还是两者

所有这些都是由为核心编写的代码处理的。当然,您可以在每个 WP AJAX 处理程序中手动实现所有这些操作,但是这更简洁和测试 (WP 社区中很少有足够的能够正确执行此操作) 。使我的端点仅适用于管理员:

register_rest_route( 'tomjn/v1', '/test/', array(
    'methods' => 'GET',
    'callback' => 'tomjn_rest_test',
    'permission_callback' => function( $req ) {
        return current_user_can('manage_options');
    }
) );

作为一个奖励,它使某些最佳实践更容易使用,例如返回数据不是 HTML,使用标准 HTTP GET PUT POST 等,并返回可以验证的 JSON 响应

端点始终处于活动状态的情况如何?

之前我提到本机端点是活动的,即使其内部的插件被禁用。关闭它的唯一方法是通过内部检查,或删除文件。为什么这么糟糕?

这一点的关键在于,在某种情况下可能适用的可能不在另一种情况。

例如,情景 1:

管理员安装一个插件,允许用户在前端登录并注册,而无需刷新页面。为了做到这一点,插件有一个端点来创建用户。然而,管理员意识到注册不是他们想要的,只能登录,并停用该插件。这些文件仍然存在,用户仍然可以加载端点来创建新用户。

情景 2:

在多站点安装中正在使用一个插件,通过联系表单向博客的管理员发送电子邮件。这一切都按预期工作,但网站上还有其他对此功能不感兴趣的博客。通过更改博客使用的域名,攻击者可以通过在网络上的其他博客的上下文中加载联系人表单使用的端点,向这些其他博客的管理员发送电子邮件,向任何具有管理角色的人发送电子邮件多站点安装的任何地方

情景 3:

插件具有一个有用的调试功能,允许用户更改其电子邮件,但出于安全原因,您已关闭此功能。然而,处理电子邮件更改表单的端点是一个独立的文件,任何知道如何构建表单的人仍然可以更改其电子邮件

次佳解决方案

编写自定义文件端点的主要缺点是,您的文件不知道 wp-load.php 在一般情况下的位置。无论何时在 WP 环境中,都提供了上下文。如果您正在尝试从任意 PHP 文件中找到 WP 核心的位置,那么它将不会对所有可能的配置起作用。

因此,这种技术的最大缺点是它不能在公共扩展中分发。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。