LaravelIP地址验证怎么写

wen PHP项目 1

本文目录导读:

LaravelIP地址验证怎么写

  1. 使用验证规则
  2. 自定义验证规则
  3. 在 Form Request 中使用
  4. 控制器中的完整示例
  5. JavaScript 用于实时验证 IP 地址
  6. 最佳实践建议

在 Laravel 中验证 IP 地址有多种方式,以下是几种常见方法:

使用验证规则

基本 IP 验证

$request->validate([
    'ip_address' => 'required|ip',
]);

验证特定版本

// IPv4
$request->validate([
    'ip_address' => 'required|ipv4',
]);
// IPv6
$request->validate([
    'ip_address' => 'required|ipv6',
]);

允许空值

$request->validate([
    'ip_address' => 'nullable|ip',
]);

自定义验证规则

在白名单中的 IP

use Illuminate\Support\Facades\Validator;
Validator::extend('allowed_ip', function ($attribute, $value, $parameters, $validator) {
    $allowedIps = ['192.168.1.1', '10.0.0.1', '::1'];
    return in_array($value, $allowedIps);
});
// 使用
$request->validate([
    'ip_address' => 'required|allowed_ip',
]);

IP 范围验证

use Illuminate\Support\Facades\Validator;
Validator::extend('ip_in_range', function ($attribute, $value, $parameters, $validator) {
    $range = $parameters[0] ?? '192.168.1.0/24';
    // 简单的 IP 范围检查
    if (strpos($range, '/') !== false) {
        list($subnet, $bits) = explode('/', $range);
        $ip = ip2long($value);
        $subnet = ip2long($subnet);
        $mask = -1 << (32 - $bits);
        $subnet &= $mask;
        return ($ip & $mask) == $subnet;
    }
    return false;
});
// 使用
$request->validate([
    'ip_address' => 'required|ip_in_range:192.168.1.0/24',
]);

在 Form Request 中使用

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreIpRequest extends FormRequest
{
    public function rules()
    {
        return [
            'ip_address' => 'required|ip|unique:ip_records,ip_address',
            'description' => 'nullable|string|max:255',
        ];
    }
    public function messages()
    {
        return [
            'ip_address.required' => 'IP 地址是必需的',
            'ip_address.ip' => '请输入有效的 IP 地址',
            'ip_address.unique' => '该 IP 地址已存在',
        ];
    }
}

控制器中的完整示例

namespace App\Http\Controllers;
use App\Models\IpRecord;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class IpController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'ip_address' => [
                'required',
                'ip',
                function ($attribute, $value, $fail) {
                    // 自定义验证逻辑
                    if (strpos($value, '192.168.') === 0) {
                        $fail('不允许使用内网 IP 地址');
                    }
                },
            ],
        ]);
        if ($validator->fails()) {
            return response()->json($validator->errors(), 422);
        }
        // 存储 IP 地址
        IpRecord::create($request->all());
        return response()->json(['message' => 'IP 地址已保存']);
    }
}

JavaScript 用于实时验证 IP 地址

function isValidIP(ip) {
    const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
    const ipv6Regex = /^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$/;
    if (ipv4Regex.test(ip)) {
        // 验证每个数字在 0-255 之间
        return ip.split('.').every(num => {
            const n = parseInt(num, 10);
            return n >= 0 && n <= 255;
        });
    }
    return ipv6Regex.test(ip);
}

最佳实践建议

  • 白名单验证:对于敏感操作,验证 IP 是否在白名单中
  • 频率限制:配合 throttle 中间件防止滥用
  • 日志记录:记录所有 IP 验证失败的尝试
  • 错误信息:提供清晰的错误提示

选择哪种方式取决于你的具体需求,对于大多数场景,使用内置的 ipipv4/ipv6 规则就足够了。

抱歉,评论功能暂时关闭!