PHP限制IP

本文介绍了一个简单的PHP脚本,用于实现网站对特定IP地址的访问限制。通过从客户端获取IP地址并与预设的限制列表进行比对,可以有效阻止不受欢迎的访问者。

PHP限制IP

<?php
/*********************************************
* 文件:limitip.php
* 用途:IP限制程序
* 版本:v1.0
* 日期:2005-1-7 12:34
* 作者:heiyeluren (heiyeluren@163.com)
* 版权:http://www.unixsky.net
*********************************************/

error_reporting(7);
session_start();

// 发送字符头信息
if ($headercharset)
header("Content-Type:text/html; charset=gb2312");

// 加载公共文件
require_once("config.php");
require_once("global.php");
require_once("db_mysql.php");

/***************** 进行客户端能否访问本网站校验 ************/

// 获取客户端IP
if(getenv('HTTP_CLIENT_IP')) {
$client_ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$client_ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$client_ip = getenv('REMOTE_ADDR');
} else {
$client_ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}

// 分解客户端IP
$cip = explode(".", $client_ip);

// 连接数据库
$db = new DB_Sql();
$err = $db->connect();

/*限制远程IP访问, PS: 这段代码真晕,呵呵,用了8个if, -_-#*/
// 从数据库中提取存储的要限制的IP地址
$query_str = "SELECT limit_ip FROM us_limitip";
$db->query($query_str);
// 把结果循环提取,一个个进行校验
while ($db->next_record())
{
$limit_ip = $db->f("limit_ip");
$lip = explode(".", $limit_ip);
// 如果限制IP的第一个是*或者是0的话就跳到错误页
if (($lip[0]=='*') || ($lip[0]=='0'))
header("Location:../error.php?errid=300");
// 如果刚好客户端IP等于我们限制IP就跳到错误页
if ($client_ip==$limit_ip)
header("Location:../error.php?errid=300");
// 如果第一组IP一致进行第二组IP的匹配
if ($cip[0] == $lip[0])
{
// 如果第二组限制IP是*就跳到错误页
if ($lip[1]=='*')
header("Location:../error.php?errid=300");
// 第二组IP匹配就进行第三组IP匹配
if ($cip[1]==$lip[1])
{
// 如果第三组限制字符是*就跳到错误页
if ($lip[2]=='*')
header("Location:../error.php?errid=300");
// 如果第三组IP匹配就跳到第三组校验
if ($cip[2]==$lip[2])
{
// 如果第四组限制IP是*或0就跳到错误页
if (($lip[3]=='*') || ($lip[3]=='0'))
header("Location:../error.php?errid=300");
}
}
}
}
// 释放数据库查询结果
$db->free();

/****************** IP校验结束 ******************/

?>

### PHP限制特定 IP 地址段访问的方法 为了实现对特定 IP 地址段的访问控制,在 PHP 中可以通过获取客户端 IP 并将其与预定义的允许列表进行匹配来完成。下面是一个具体的实现方式: #### 函数 `check_ip` 的设计 此函数用于验证当前请求者的 IP 是否属于预先设定的安全范围。 ```php <?php /** * 检查来访者IP是否位于许可范围内. */ function check_ip() { // 定义允许访问的IP地址段 $allowed_ips = array( '192.168.2.*', // 局域网内某一段 '127.0.0.1' // 本地回环接口 ); // 获取用户的实际IP地址 if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $client_ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $client_ip = $_SERVER['REMOTE_ADDR']; } foreach ($allowed_ips as $pattern) { // 使用正则表达式处理通配符(*)的情况 $regex_pattern = str_replace('\*', '[\d]*', preg_quote($pattern)); if (preg_match("/^{$regex_pattern}$/", $client_ip)) { return true; // 如果匹配成功,则允许继续执行后续操作 } } header("HTTP/1.0 403 Forbidden"); echo "您所在的IP不在授权访问名单之内"; exit(); // 终止程序运行,防止未授权访问 } ?> ``` 上述代码片段展示了如何构建一个能够接受带有星号(`*`)作为通配符表示法的一部分模式字符串,并利用正则表达式的灵活性来进行精确匹配[^1]。 当接收到 HTTP 请求时,先尝试从不同的服务器变量中提取真实的客户机 IP 地址(考虑到可能存在的代理情况),再逐一比较这些 IP 和配置好的白名单中的条目。一旦发现符合条件即放行;反之,则发送状态码为 403 的响应给浏览器并停止进一步的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值