如何加载 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 脚本一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 Git 以将其与 Dropbox 一起使用?

如何模拟 JWT 令牌以将其与 Mockito 和 Spring Boot 一起使用

如何为我的 SQL 数据库添加远程主机以将其与我开发的应用程序连接

Django ALLOWED_HOSTS IP 范围

重构此方法以将其认知复杂度从 16 降低到允许的 15。如何重构和降低复杂度?

如何在 Python 中快速从 IP 地址列表中查找纬度/经度?