WordPress工具站防刷接口实战:用 admin-ajax + 主题人机验证 + mu-plugins保护第三方API

代码笔记3小时前更新
11 1 0

做工具站时,若把第三方查询(备案、同 IP 反查等)写成一个可直接访问的 PHP 地址,很容易被脚本或爬虫批量请求;API 按次计费时损失很明显。

WordPress工具站防刷接口实战:用 admin-ajax + 主题人机验证 + mu-plugins保护第三方API

WordPress工具站防刷接口实战

一、核心思路

  • 关闭裸接口:例如原 /公开目录/旧查询.php 仅返回 403,不再向第三方发请求。
  • 只走 WordPress:用 admin-ajax.php 注册自定义 action,服务端再 wp_remote_* 调第三方。
  • 护栏nonce、主题人机验证、按 IP 限流。

二、三个插件文件(名称请自定)

仅作结构说明,实际文件名、目录你可自己定,例如:

  1. must-use-plugins/01-captcha-shared.php(数字前缀仅为加载顺序):只提供 my_tools_verify_captcha( $captcha, $post ) 这类函数,与主题人机类型一致;不写具体业务。
  2. must-use-plugins/my-query-foo.php:业务 A 的 wp_ajax_*、nonce、限流、人机、远程 API、返回格式。
  3. must-use-plugins/my-query-bar.php:业务 B,同上,另一套 action 与逻辑。

两个业务文件内使用 require_once __DIR__ . '/01-captcha-shared.php';(路径按你实际文件名修改)。

三、关闭旧裸接口(示例)

<?php
header('Content-Type: application/json; charset=UTF-8');
http_response_code(403);
echo json_encode(
    array('error' => '此接口已停用,请使用站内工具页面。'),
    JSON_UNESCAPED_UNICODE
);
exit;

四、引入共享校验并调用

此内容仅对已评论用户可见,请先评论后查看。

五、注册 AJAX(action 名请自定)

此内容仅对已评论用户可见,请先评论后查看。

六、页脚输出人机类型(变量名请自定)

add_action('wp_footer', static function () {
    if (!is_singular()) {
        return;
    }
    $type = '';
    if (function_exists('io_get_option')) {
        $t = io_get_option('captcha_type', 'null');
        if ($t !== 'null' && $t !== '') {
            $type = $t;
        }
    }
    $type = apply_filters('my_foo_captcha_type', $type);
    echo '<script>window.MY_FOO_CAPTCHA_TYPE=' . wp_json_encode($type) . ';</script>';
}, 1);

七、主题模板片段(路径与 ID 请自定)

工具页面放在主题下任意 include 的模板即可,例如 主题目录/tools/某工具.php,不必与下文同名。

<?php wp_nonce_field('my_foo_action', 'my_foo_nonce', false, true); ?>
<?php
if (function_exists('get_captcha_input_html')) {
    $html = get_captcha_input_html('my_foo_captcha');
    if (is_string($html) && $html !== '') {
        echo $html;
    }
}
?>
jQuery(function ($) {
  var $btn = $('[data-action="my_query_foo"]');
  var data = $('#my-foo-form').serializeObject();
  data.captcha_type = window.MY_FOO_CAPTCHA_TYPE || '';

  captcha_ajax($btn, data, function (n) {
    if (!n.success) {
      layer.msg((n.data && n.data.msg) ? n.data.msg : '失败');
      return;
    }
  });
});

八、密钥常量名请自定

define('MY_THIRD_PARTY_API_KEY', '你的密钥');

九、请求顺序与预期

  1. 打开页面 → 加载人机脚本与表单项。
  2. 完成人机 → POST:nonce、captcha、业务参数。
  3. 服务端:nonce → 限流 → my_tools_verify_captcha → 远程 API。

可挡住大量直接扫 URL、简单脚本;专业打码与多 IP 需额外手段(WAF、登录查询等)。

十、扩展与 mu-plugins 说明

共享校验文件让新工具只需复用「nonce + 限流 + 校验 + 远程请求」。mu-plugins 自动加载、主题更新不覆盖;也可改为普通插件或子主题 functions.php

© 原创声明:本文由 四六啦工具 于 1 年 前发表在 代码笔记 分类目录中,最后更新于2026年4月8日,转载请注明本文永久链接:https://www.46.la/gongjuzhan-fangshua-jiekou-jiaocheng

相关文章

1 条评论

  • 安安
    安安

    不错的文章

    回复