如何加载 IP 范围列表以将其与 $allowedIps 脚本一起使用?
Posted
技术标签:
【中文标题】如何加载 IP 范围列表以将其与 $allowedIps 脚本一起使用?【英文标题】:How to load a list of ip ranges to use it with $allowedIps script? 【发布时间】:2021-12-09 09:57:12 【问题描述】:对不起,我是新手,但我正在尝试使用我在这里找到的脚本:
Only allow users on page if IP address is approved
$allowedIps = ['x.x.x.x', 'x.x.x.x'];
$userIp = $_SERVER['REMOTE_ADDR'];
if (!in_array($userIp, $allowedIps))
exit('Unauthorized');
但是,我想从 .txt 文件中加载数千个 IP 范围
像这样:(我不知道正确的功能)
$allowedIps = ['www.example.com/ip_list.txt'];
ip_list.txt 列表:
xx.xxx.xxx.xx/30
xx.xxx.xxx.xx/78
xx.xxx.xxx.xx/59
【问题讨论】:
见php.net/file @u_mulder 我查了一下,但不知道如何将函数添加到这个脚本中。 IP列表是本地文件还是远程文件? 远程IP范围 【参考方案1】:/*
You need the proper fopen wrapper server settings for reading
URLs using file_get_contents, see the notes at the PHP manual
*/
$allowedIps = explode('\n', file_get_contents('http://my/url/file.txt'));
$userIp = $_SERVER['REMOTE_ADDR'];
if (!in_array($userIp, $allowedIps))
exit('Unauthorized');
PHP manual for file_get_contents
【讨论】:
谢谢你,它有效! @Mark,太好了;那你能把它标记为接受的答案吗? 符号 xx.xxx.xxx.xx/30 也代表 IP 范围。答案中没有考虑到这一点。【参考方案2】:此脚本将从文件中获取 IP 列表,将其拆分为行,然后将 CIDR 表示法转换为 IP 数组,并将它们合并在一起。然后执行检查,如果远程地址不在可接受的 IP 列表中,则会给出 HTTP 403 代码。
<?php
// Function courtesy of the following answer
// https://***.com/questions/4931721/getting-list-ips-from-cidr-notation-in-php
function cidrToRange($cidr)
$range = array();
$cidr = explode('/', $cidr);
$range[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
$range[1] = long2ip((ip2long($range[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
return $range;
$file = 'http://www.example.com/ip_list.txt'; // don't forget http://
$lines = file($file);
$ips = [];
foreach ($lines as $line)
$ips = array_merge($ips, cidrToRange($line));
$user_ip = $_SERVER['REMOTE_ADDR'];
if (!in_array($user_ip, $ips))
header('HTTP/1.0 403 Forbidden');
exit;
【讨论】:
不报错,让未列出的ip进来。 做一个var_dump($ips)
和var_dump($user_ip)
,不是在里面吗?以上是关于如何加载 IP 范围列表以将其与 $allowedIps 脚本一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何模拟 JWT 令牌以将其与 Mockito 和 Spring Boot 一起使用
如何为我的 SQL 数据库添加远程主机以将其与我开发的应用程序连接