Yii2推荐使用内置ip验证器实现IP校验,支持IPv4/IPv6、CIDR子网(如192.168.0.0/16)、黑白名单及可信代理配置。

<p>在 Yii2 中验证 IP 参数,推荐使用内置的 <code>ip</code> 验证器,它支持 IPv4、IPv6、子网范围(CIDR)、白名单/黑名单等,无需手写正则或逻辑判断。</p>
<H3>1. 基础 IP 格式校验(IPv4 / IPv6)</H3>
<p>在模型的 <code>rules()</code> 方法中直接使用 <code>'ip'</code> 验证器:</p>
<font color="#888">
<pre class="brush:php;toolbar:false;"><code>public function rules()
{
return [
[['client_ip'], 'ip'], // 允许 IPv4 和 IPv6
// 或限定仅 IPv4
// [['client_ip'], 'ip', 'ipv4' => true, 'ipv6' => false],
// 或仅 IPv6
// [['client_ip'], 'ip', 'ipv4' => false, 'ipv6' => true],
];
}</code>
2. 限制 IP 所属子网(CIDR 范围校验)
验证请求 IP 是否属于指定网段,例如只允许来自内网 192.168.0.0/16 的访问:
<code>['client_ip', 'ip', 'networks' => ['192.168.0.0/16', '10.0.0.0/8']], // 支持多个 CIDR,也支持单个 IP(如 '127.0.0.1') // 注意:'networks' 是精确匹配,不自动包含广播地址或网络地址</code>
3. 黑白名单校验(显式 IP 列表)
校验 IP 是否在允许或禁止列表中:
<code>// 白名单(只允许以下 IP) ['client_ip', 'ip', 'ranges' => ['192.168.1.100', '10.0.5.25', '2001:db8::1']], // 黑名单(禁止以下 IP) ['client_ip', 'ip', 'not' => true, 'ranges' => ['192.168.1.1', '127.0.0.1']],</code>
4. 实际使用示例(控制器中获取并验证)
假设你从请求头或参数中获取 IP,并传入模型校验:
<code>// 控制器 action
public function actionLogin()
{
$model = new LoginForm();
$model->client_ip = Yii::$app->request->get('ip',
Yii::$app->request->getUserIP() // 回退到真实客户端 IP
);
if ($model->validate()) {
// 验证通过
return $this->asJson(['success' => true]);
}
return $this->asJson(['success' => false, 'errors' => $model->getErrors()]);
}</code>
注意:Yii 默认的 getUserIP() 已处理 X-Forwarded-For 等常见代理头,如需自定义可信代理,请配置 Request::trustedHosts。


















