使用 PHP 验证非私有 IP 地址

2024-02-21

我正在尝试检查 IP 地址是否是仅限内部(即私有)IP,但我得到了一个奇怪的结果:

filter_var('173.194.66.94', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns 173.194.66.94
filter_var('192.168.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns false
filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns 127.0.0.1?

127.0.0.1 肯定算作私有 IP 吗?我发现2010 年的错误报告 https://bugs.php.net/bug.php?id=53150报告将此问题报告为问题,但已标记为已修复。这是回归,还是我误解了这个过滤器的作用?我正在使用 PHP 5.4.6。


我想那是因为 127.0.0.1 并不是真正的privateIP范围,但loopbackIP 范围,如所解释here http://www.tcpipguide.com/free/t_IPReservedPrivateandLoopbackAddresses.htm

通常,当 TCP/IP 应用程序想要发送信息时,该信息会沿着协议层传输到 IP,并在 IP 数据报中封装。然后,该数据报会向下传递到设备物理网络的数据链路层,以便在到达 IP 目的地的途中传输到下一跳。

然而,为环回功能预留了一个特殊的地址范围。范围是 127.0.0.0 到 127.255.255.255。主机发送到 127.x.x.x 环回地址的 IP 数据报不会向下传递到数据链路层进行传输。相反,它们在 IP 级别“环回”到源设备。本质上,这代表了正常协议栈的“短路”;数据由设备的第三层 IP 实现发送,然后立即由设备接收。

环回范围的目的是测试主机上的 TCP/IP 协议实现。由于较低层是短路的,因此发送到环回地址可以有效测试较高层(IP 及以上),而不会在较低层出现问题。 127.0.0.1 是最常用于测试目的的地址。

该手册用于过滤标志 http://www.php.net/manual/en/filter.filters.flags.php对此具体问题有评论。

<?php
function FILTER_FLAG_NO_LOOPBACK_RANGE($value) {
    // Fails validation for the following loopback IPv4 range: 127.0.0.0/8
    // This flag does not apply to IPv6 addresses
    return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? $value :
        (((ip2long($value) & 0xff000000) == 0x7f000000) ? FALSE : $value);
}

$var = filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE

$var = filter_var('74.125.19.103', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns '74.125.19.103'

// To filter Private IP ranges and Loopback ranges
$var = filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)  && filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PHP 验证非私有 IP 地址 的相关文章

  • php postgresql pdo 从标准输入复制

    COPY table name field1 field2 field3 FROM STDIN CSV 1 2 q w 3 4 a s 5 6 d 如何通过 PDO 执行此查询 Update 问题是 PDO 驱动程序将此查询作为语句执行 例
  • 将子域重定向到 CakePHP 操作

    背景 我有一个 CakePHP 应用程序 位于 m 我想写一个根级别的 htaccess文件 它将重定向网站的 子域 作为操作的参数 例如 我想编写一个重写规则 这将导致像这样的重定向 http mysite myserver com ht
  • 从 stdin 读取后,PHP 在每行上给出尾随“=”

    stdin 的内容因自动换行和尾随 而被损坏 这显然破坏了我需要发布的 URL 我需要从电子邮件中提取 URL 链接 然后发布该 URL 因此 我使用我在互联网上看到的标准代码片段将电子邮件传输到 cpanel 中的 php 脚本 fd f
  • 类似的 PHP 表单代码:如果 $_REQUEST 为空,第一个抛出错误,第二个则不抛出错误

    我是 PHP 新手 所以这可能是一个简单的答案 希望我能正确地按照 SO 标准格式化它 对于该网站来说仍然是新的 我正在通过 SitePoint 编写两组非常相似的代码 提交表单数据并使用 htmlspecialchars 来阻止 XSS
  • MySQL 和 PHP:多关键字搜索

    我有一个包含逗号分隔关键字的字符串 例如 keywords keyword1 keyword2 keyword3 我的表架构 名为tbl address是这样的 简化的 id INT 11 PRIMARY KEY AUTO INCREMEN
  • PHP:__toString() 和 json_encode() 不能很好地协同工作

    我遇到了一个奇怪的问题 我不知道如何解决它 我有几个类 它们都是 JSON 对象的 PHP 实现 这是问题的说明 class A protected a public function construct this gt a array n
  • php简单xml如何读取具有不同子节点级别的多个节点

    我有一个 xml 文件 其中包含不同的命名节点和多级子节点 每个节点之间都不同 我应该如何访问数据 需要很多嵌套的for循环吗 以下是 xml 代码示例
  • Laravel 5 Eloquent 关系:无法修改/覆盖关系表属性

    我正在使用 Laravel 5belongsToMany使用中间数据透视表定义相关表的方法 我的应用程序正在使用雄辩的模型Tour and 旅游类别 在游览模型中我有 namespace App use Illuminate Databas
  • 通过日期选择器过滤查询后检索具有特定值的行数[重复]

    这个问题在这里已经有答案了 目前 我正在使用 CodeIgniter 来检索特定时间范围内的数据 所有这些条目都有一个状态 我想将具有相同状态的所有条目分组并将其显示在各自的标题中 目前 这是我的模型类 其中我有以下条目来返回特定日期范围内
  • 如何在xampp中启用curl

    我面临下面给出的错误 致命错误 在第 11 行调用 E xampp htdocs new functions php 中未定义的函数curl init 我已经做出了改变php ini 我把前面的分号去掉了 extension php cra
  • PHP json_encode 将多个数组编码为一个对象

    我试图在一个 JSON 对象中返回多个数组 但在语法上遇到一些困难 一款 Android 应用程序从多个表接收更新 我希望在一个响应中返回这些更新 目前 这就是我对各种结果集进行编码的方式 json json encode array ta
  • 如何使用来自数据库的值来定义 Twig 模板的全局变量?

    我想为 twig 定义一个全局变量 可以从任何模板访问它 我可以在 symfony 中创建一个全局变量config packages twig yaml 但我需要它是从数据库获取的值 在 twig 的文档中 它说使用此代码 twig new
  • PHPstorm - 无法在blade.php 文件中设置断点

    我正在开发 Laravel 应用程序 可以很好地调试我的控制器 php 文件 但我还想调试blade php 文件 在我当前的设置中 我遵循了所有 jetbrains 为 Laravel 推荐的设置 https confluence jet
  • 如何设置外键id的id #sf2 #doctrine2

    我正在尝试手动为对象设置外键 id 但没有找到如何执行此操作 class Item ORM ManyToOne targetEntity MyBundle Entity ItemType inversedBy itemTypes ORM J
  • 即使 is_dir 是一个目录,它也会返回 false 吗?

    为什么 is dir 即使是一个目录也会返回 false 没有返回错误 path mysql var lib mysql if is dir path mysql echo error 返回错误 path mysql var lib mys
  • 按时间戳字段中的日期过滤结果

    我已经获得了一些帮助 但不确定为什么这不起作用 我正在尝试使用表单让用户过滤他们的活动 存储在数据库中 My code GET from 01 11 2013 GET to 25 11 2013 from DateTime createFr
  • 尝试使用curl进行GET,发送的值允许为空

    我正在尝试使用curl 来执行一个简单的GET 其中包含一个名为redirect uri 的参数 被调用的 php 文件打印出 GET redirect uri 的空字符串 它显示 red 并且似乎没有发送任何内容 执行获取操作的代码 Ge
  • PHP strtotime返回Mysql UNIX_TIMESTAMP的不同值

    我在 stackoverflow 上搜索过帖子 发现了一些类似的帖子 但我认为这是一篇不同的帖子 我的 PHP 和 Mysql 服务器的时区全部设置为 UTC 在表中我使用时间戳字段 值为 2010 11 08 02 54 15 我使用这样
  • 通过“SELECT”命令选择每组的前两条记录的最佳方法是什么?

    例如我有下表 id group data 1 1 aaa 2 1 aaa 3 2 aaa 4 2 aaa 5 2 aaa 6 3 aaa 7 3 aaa 8 3 aaa 通过 SELECT 命令选择每组的前两条记录的最佳方法是什么 如果没有
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请

随机推荐

  • 适用于 OSX 和 Windows 应用程序的 Eclipse info.plist 文件

    当我寻找隐藏 Java 应用程序停靠图标的方法时 我到处都看到info plist 文件这个 and info plist 文件表示 但我没有看到一个 我的问题是如何在 eclipse 中生成 info plist 文件 它属于哪里 当我导
  • 如何在 iPhone 的导航栏中添加右栏按钮

    我想在导航栏中添加一个右栏按钮项目 以便单击时执行某些功能 我创建了以下代码来添加右侧栏按钮项目 但完成后 栏按钮项目没有显示在导航栏中 void viewDidload self navigationItem rightBarButton
  • 从文件夹中的图像序列获取 numpy 数组

    我有一个文件夹 比如说video1一堆按顺序排列的图像frame 00 png frame 01 png 我想要的是格式为 4D numpy 数组 number of frames w h 3 这就是我所做的 但我认为它很慢 有没有更快或更
  • 在哪里可以找到图形命令 shell?

    终端和 shell 非常强大 但学习起来可能很复杂 尤其是要充分利用它们 有谁知道有一个更加基于 GUI 的命令 shell 可以帮助用户或以更友好的方式显示答案 我知道 IPython 但即使它的语法也有点复杂 尽管这是朝着正确方向迈出的
  • 将片段从 GraphQL 文件导入到另一个 GraphQL 文件不起作用

    我正在尝试使用 graphql 文件并传递变量来对空手道进行测试 在我的 graphql 模式上 我试图重用另一个 graphql 文件中的片段 我尝试按照以下说明进行操作https www apollographql com docs r
  • 为什么GetType成功时FindType却获取不到RTTI?

    我正在尝试使用来抓住一个物体TRttiContext FindType QualifiedTypeName 这是我所得到的 program MissingRTTI APPTYPE CONSOLE uses System SysUtils R
  • 我无法让 super() 在 python 2.7 中工作

    通过一对简单的课程 我无法获得超级工作 class A object q foo class B A q bar def init self self a super A self q a B 像这样的错误 AttributeError T
  • Play框架2.4:NoClassDefFoundError:play/api/cache/CachePlugin

    在尝试从 Play 2 2 更新到 Play 2 4 时 我遇到了这个绊脚石 我还添加了 memcached2 插件 但已禁用 我的conf文件 Cache configuration To avoid conflict with play
  • 在 Socket.IO 客户端断开连接时释放事件处理程序

    我正在使用 Socket IO 如本示例所示 io sockets on connection function socket myService on myevent function socket emit myevent some s
  • Spyder - python - 安装外部包

    我刚刚开始使用 python 在 Windows 中 64 位 我有一个关于如何在 anaconda spyder 环境中安装外部包的基本问题 据我所知 对于大多数软件包 可以简单地使用 conda install bunnys 但是 某些
  • 检查tomcat是否运行? [复制]

    这个问题在这里已经有答案了 可能的重复 Tomcat 正在运行吗 https stackoverflow com questions 3944157 is tomcat running hi 我在虚拟机中安装了tomcat服务器 我想每天检
  • Python Tensorflow - 多次运行 model.fit 而不重新实例化模型

    背景 我正在看一个热门 YouTube 速成课程 https youtu be tPYj3fFJGjk t 12950关于机器学习 At 3 35 50 https youtu be tPYj3fFJGjk t 12950 他提到该模型可能
  • 在 awk 中打印其余字段

    假设我们有这个数据文件 john 32 maketing executive jack 41 chief technical officer jim 27 developer dela 33 assistant risk managemen
  • Windows 工作组上的 Microsoft 服务总线

    我刚刚开始使用 Microsoft Service Bus 现在 我个人面临的挑战是 我是在下班后 在自己的时间等进行此操作 这意味着我正在使用虚拟机和非域电脑 这些人都是工作组 我取得了相当大的成功 特别是在我偶然发现这个链接之后 Mic
  • 启动屏幕等待线程完成

    我仍然遇到闪屏问题 我不想使用该房产SC TopMost true 现在我的应用场景如下 在程序 cs中 STAThread static void Main new SplashScreen tempAL where tempAL is
  • 如何在具有最终字段的抽象类上使用 Lombok @SuperBuilder

    给定以下带有 Lombok 注释的类 Data and SuperBuilder Data SuperBuilder public abstract class Parent protected final String userId pr
  • 按位求补运算符

    你们能解释一下下面的程序吗 int main int max 0 printf d n max return 0 AFAIK 会翻转位 在这种情况下 即 0 会将所有位设置为 1 因此 max 变量应包含 MAX 值 但我得到的 o p 为
  • 为什么工作流程设计器在编辑构建流程模板时速度如此之慢?

    除了上面的问题之外 没有什么需要补充的了 我有一个相当简单的构建过程模板 它几乎没有偏离默认模板 我有两个自定义活动 根据建议 它们位于同一解决方案中的单独程序集中 然而 打开模板大约需要两分钟 更改工作流中活动的属性 重新排序工作流中的活
  • bash计算人的年龄并读取csv文件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个包含三列的 csv 文件 其
  • 使用 PHP 验证非私有 IP 地址

    我正在尝试检查 IP 地址是否是仅限内部 即私有 IP 但我得到了一个奇怪的结果 filter var 173 194 66 94 FILTER VALIDATE IP FILTER FLAG NO PRIV RANGE returns 1