本文目录导读:

在 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 验证失败的尝试
- 错误信息:提供清晰的错误提示
选择哪种方式取决于你的具体需求,对于大多数场景,使用内置的 ip 或 ipv4/ipv6 规则就足够了。