简单的 WordPress IP 限制访问插件-资源论坛-小武站

简单的 WordPress IP 限制访问插件

这个插件将允许管理员设置允许或禁止访问网站的 IP 地址列表,增强网站的安全性。

<?php
/*
Plugin Name: IP 限制访问
Plugin URI: https://example.com/
Description: 限制特定 IP 地址访问网站后台或前台
Version: 1.0
Author: Your Name
Author URI: https://example.com/
License: GPL2
*/

// 防止直接访问文件
if (!defined('ABSPATH')) {
    exit;
}

// 注册插件设置页面
add_action('admin_menu', 'ip_restriction_add_admin_menu');
add_action('admin_init', 'ip_restriction_settings_init');

function ip_restriction_add_admin_menu() {
    add_options_page(
        'IP 限制访问',
        'IP 限制访问',
        'manage_options',
        'ip-restriction',
        'ip_restriction_options_page'
    );
}

function ip_restriction_settings_init() {
    register_setting('ip_restriction_plugin', 'ip_restriction_settings', 'ip_restriction_sanitize_settings');

    add_settings_section(
        'ip_restriction_section',
        'IP 限制设置',
        'ip_restriction_section_callback',
        'ip_restriction_plugin'
    );

    add_settings_field(
        'ip_restriction_mode',
        '限制模式',
        'ip_restriction_mode_render',
        'ip_restriction_plugin',
        'ip_restriction_section'
    );

    add_settings_field(
        'ip_restriction_list',
        'IP 地址列表',
        'ip_restriction_list_render',
        'ip_restriction_plugin',
        'ip_restriction_section'
    );

    add_settings_field(
        'ip_restriction_apply_to',
        '应用范围',
        'ip_restriction_apply_to_render',
        'ip_restriction_plugin',
        'ip_restriction_section'
    );

    add_settings_field(
        'ip_restriction_error_message',
        '错误提示信息',
        'ip_restriction_error_message_render',
        'ip_restriction_plugin',
        'ip_restriction_section'
    );
}

function ip_restriction_sanitize_settings($input) {
    $sanitized = array();
    
    // 验证限制模式
    $sanitized['mode'] = isset($input['mode']) && in_array($input['mode'], array('whitelist', 'blacklist')) 
        ? $input['mode'] 
        : 'whitelist';
    
    // 验证并清理IP地址列表
    $sanitized['ip_list'] = isset($input['ip_list']) ? trim($input['ip_list']) : '';
    
    // 验证应用范围
    $sanitized['apply_to'] = isset($input['apply_to']) && in_array($input['apply_to'], array('admin', 'frontend', 'both'))
        ? $input['apply_to']
        : 'admin';
    
    // 验证错误信息
    $sanitized['error_message'] = isset($input['error_message']) ? sanitize_text_field($input['error_message']) : '您的IP地址被限制访问此网站。';
    
    return $sanitized;
}

function ip_restriction_section_callback() {
    echo '<p>设置允许或禁止访问网站的IP地址。每行输入一个IP地址,可以使用CIDR表示法(如192.168.1.0/24)。</p>';
}

function ip_restriction_mode_render() {
    $options = get_option('ip_restriction_settings');
    $mode = isset($options['mode']) ? $options['mode'] : 'whitelist';
    
    echo '<label>';
    echo '<input type="radio" name="ip_restriction_settings[mode]" value="whitelist" ' . checked('whitelist', $mode, false) . '> ';
    echo '白名单模式(仅允许列表中的IP访问)';
    echo '</label><br>';
    
    echo '<label>';
    echo '<input type="radio" name="ip_restriction_settings[mode]" value="blacklist" ' . checked('blacklist', $mode, false) . '> ';
    echo '黑名单模式(禁止列表中的IP访问)';
    echo '</label>';
}

function ip_restriction_list_render() {
    $options = get_option('ip_restriction_settings');
    $ip_list = isset($options['ip_list']) ? $options['ip_list'] : '';
    
    echo '<textarea name="ip_restriction_settings[ip_list]" rows="8" cols="50" class="large-text code">' . esc_textarea($ip_list) . '</textarea>';
    echo '<p class="description">每行输入一个IP地址或IP段(如192.168.1.100或192.168.1.0/24)</p>';
}

function ip_restriction_apply_to_render() {
    $options = get_option('ip_restriction_settings');
    $apply_to = isset($options['apply_to']) ? $options['apply_to'] : 'admin';
    
    echo '<select name="ip_restriction_settings[apply_to]">';
    echo '<option value="admin" ' . selected('admin', $apply_to, false) . '>仅后台</option>';
    echo '<option value="frontend" ' . selected('frontend', $apply_to, false) . '>仅前台</option>';
    echo '<option value="both" ' . selected('both', $apply_to, false) . '>后台和前台</option>';
    echo '</select>';
}

function ip_restriction_error_message_render() {
    $options = get_option('ip_restriction_settings');
    $error_message = isset($options['error_message']) ? $options['error_message'] : '您的IP地址被限制访问此网站。';
    
    echo '<input type="text" name="ip_restriction_settings[error_message]" value="' . esc_attr($error_message) . '" class="large-text">';
}

function ip_restriction_options_page() {
    ?>
    <form action='options.php' method='post'>
        <h1>IP 限制访问设置</h1>
        <?php
        settings_fields('ip_restriction_plugin');
        do_settings_sections('ip_restriction_plugin');
        submit_button();
        ?>
    </form>
    <?php
}

// IP限制核心功能
add_action('init', 'ip_restriction_check_access');

function ip_restriction_check_access() {
    // 获取当前用户IP
    $current_ip = ip_restriction_get_user_ip();
    
    // 获取设置
    $options = get_option('ip_restriction_settings');
    
    // 如果未设置,不进行限制
    if (empty($options) || empty($options['ip_list'])) {
        return;
    }
    
    // 检查应用范围
    $apply_to = isset($options['apply_to']) ? $options['apply_to'] : 'admin';
    $is_admin = is_admin();
    
    // 根据应用范围决定是否检查
    if (($apply_to == 'admin' && !$is_admin) || ($apply_to == 'frontend' && $is_admin)) {
        return;
    }
    
    // 解析IP列表
    $ip_list = explode("\n", $options['ip_list']);
    $ip_list = array_map('trim', $ip_list);
    $ip_list = array_filter($ip_list); // 移除空行
    
    // 检查IP是否在列表中
    $ip_in_list = ip_restriction_ip_in_list($current_ip, $ip_list);
    
    // 检查限制模式
    $mode = isset($options['mode']) ? $options['mode'] : 'whitelist';
    $error_message = isset($options['error_message']) ? $options['error_message'] : '您的IP地址被限制访问此网站。';
    
    // 白名单模式:不在列表中则拒绝访问
    if ($mode == 'whitelist' && !$ip_in_list) {
        wp_die($error_message, '访问被拒绝', array('response' => 403));
    }
    
    // 黑名单模式:在列表中则拒绝访问
    if ($mode == 'blacklist' && $ip_in_list) {
        wp_die($error_message, '访问被拒绝', array('response' => 403));
    }
}

// 获取用户真实IP
function ip_restriction_get_user_ip() {
    $ip_address = '';
    
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip_address = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // 从代理中获取第一个IP
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip_address = trim($ips[0]);
    } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
        $ip_address = $_SERVER['REMOTE_ADDR'];
    }
    
    return $ip_address;
}

// 检查IP是否在列表中(支持CIDR)
function ip_restriction_ip_in_list($ip, $list) {
    foreach ($list as $item) {
        if (strpos($item, '/') === false) {
            // 普通IP地址
            if ($ip === $item) {
                return true;
            }
        } else {
            // CIDR格式IP段
            if (ip_restriction_cidr_match($ip, $item)) {
                return true;
            }
        }
    }
    return false;
}

// 检查IP是否匹配CIDR
function ip_restriction_cidr_match($ip, $cidr) {
    list($subnet, $mask) = explode('/', $cidr);
    
    $ip_int = ip2long($ip);
    $subnet_int = ip2long($subnet);
    $mask_int = (0xFFFFFFFF << (32 - $mask)) & 0xFFFFFFFF;
    
    return (($ip_int & $mask_int) === ($subnet_int & $mask_int));
}

// 激活插件时设置默认值
register_activation_hook(__FILE__, 'ip_restriction_activation');

function ip_restriction_activation() {
    $default_settings = array(
        'mode' => 'whitelist',
        'ip_list' => '',
        'apply_to' => 'admin',
        'error_message' => '您的IP地址被限制访问此网站。'
    );
    
    if (!get_option('ip_restriction_settings')) {
        add_option('ip_restriction_settings', $default_settings);
    }
}

 

插件功能说明

这个 IP 限制访问插件具有以下功能:


  1. 两种限制模式
    • 白名单模式:仅允许列表中的 IP 地址访问
    • 黑名单模式:禁止列表中的 IP 地址访问
  2. 灵活的应用范围
    • 仅限制后台访问
    • 仅限制前台访问
    • 同时限制后台和前台访问
  3. 支持多种 IP 格式
    • 单个 IP 地址(如 192.168.1.100)
    • CIDR 格式的 IP 段(如 192.168.1.0/24)
  4. 自定义错误信息:可以设置当访问被拒绝时显示的提示信息

安装和使用方法

  1. 在 WordPress 插件目录(wp-content/plugins/)中创建一个名为 ip-restriction 的文件夹
  2. 将上面的代码保存为 ip-restriction.php 并放入该文件夹
  3. 登录 WordPress 后台,在「插件」页面激活「IP 限制访问」插件
  4. 激活后,在「设置」菜单下会出现「IP 限制访问」选项
  5. 根据需要配置限制模式、IP 列表、应用范围和错误信息
  6. 保存设置后,插件会自动生效

使用建议

  • 在设置白名单模式时,务必将自己的 IP 地址添加到列表中,否则可能会被锁定在网站外
  • 可以在插件设置页面添加多个 IP 地址,每行一个
  • 对于动态 IP 用户,建议使用 CIDR 格式添加整个 IP 段
  • 如果需要临时禁用限制,可以清空 IP 地址列表


这个插件轻量且易于使用,适合需要限制特定 IP 访问的 WordPress 网站。