这个插件将允许管理员设置允许或禁止访问网站的 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);
}
}
没有回复内容