公众号官网说明:点击进去官方文档

如果公众号基于消息接收安全上的考虑,需要获知微信服务器的IP地址列表,以便识别出哪些消息是微信官方推送给你的,哪些消息可能是他人伪造的,可以通过该接口获得微信服务器IP地址列表。

接口调用请求说明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN

参数说明

参数 是否必须 说明
access_token 公众号的access_token

返回说明

正常情况下,微信会返回下述JSON数据包给公众号:

{"ip_list":["127.0.0.1","127.0.0.1"]
}
参数 说明
ip_list 微信服务器IP地址列表

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"}

企业号官网说明:点击进去官方文档

获取微信服务器的ip段

  • 请求说明

Https请求方式: GET

https://qyapi.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN

  • 参数说明
参数 必须 说明
access_token 调用接口凭证
  • 返回结果
{"ip_list": ["101.226.103.*", "101.226.62.*"]
}

把自己公众号的accesstoken 替换请求地址的ACCESS_TOKEN,然后get请求就可以换取到服务器的ip地址列表了,

但是有一些需要注意的地方(请看返回数据下面的内容);

公证号的ipv4地址段
{
"ip_list": [

"101.226.62.77",
"101.226.62.78",
"101.226.62.79",
···
"180.163.15.170",
"101.226.103.0\/25",
"101.226.233.128\/25",
"58.247.206.128\/25",
"182.254.86.128\/25",
"103.7.30.21",
"103.7.30.64\/26",
"58.251.80.32\/27",
"183.3.234.32\/27",
"121.51.130.64\/27"]
}
企业号的ipv4地址段
{
"ip_list": [

"101.226.103.*",
"101.226.125.*",
"101.226.62.*",
"103.7.30.*",
"112.5.138.*",
"112.90.78.*",
"117.135.171.*",
"120.198.199.*",
"140.207.54.*",
"183.61.32.*",
"203.205.167.*"]
}

请注意:

在返回的数据的地址数据中,公众号中有"101.226.103.0\/25",其中的\/是转义字符/,该地址就是"101.226.103.0/25" ,也就是说这是一个带有子网掩码的ip地址;

打印来自微信的请求头

host:你的服务器网址
user-agent:Mozilla/4.0
content-length:534
accept:*/*
cache-control:no-cache
content-type:text/xml
pragma:no-cache
x-real-ip:58.247.206.153

所以我们不能通过request.getRemoteAddr()获取微信请求的地址,

所以通过request.getHeader("x-real-ip");

同时你也应该发现ip地址58.247.206.153并没有在上面获取的ip地址列表里面

这是觉需要去利用那些带有子网掩码的ip地址了,

 /*** 判断目标ip是否属于某个ip子网* @param subIp        带有子网掩码的ip* @param ip       目标ip* @return          成功true,失败false*/private static boolean isSubnet(String subIp, String ip) {String[] subs = subIp.split("/");int[] subnetMask = getSubnetMask(Integer.parseInt(subs[1]));int[] ipArray = getIpv4Array(subs[0]);String subnet = getSubnet(subnetMask,ipArray);int[] ipArray2 = getIpv4Array(ip);String subnet2 = getSubnet(subnetMask, ipArray2);if (subnet.equals(subnet2))return true;return false;}/*** 获取子网掩码数组* @param num    子网掩码长(暨带子网掩码的ip/后面的数字)* @return      长度为4的int数组*/private static int[] getSubnetMask(int num) {int[] masks = new int[4];int index = num / 8;int remainder = num % 8;String remainderToBinary = "";for (int i = 0; i < index; i++)masks[i] = 255;for (int i = 0; i < 8; i++) {int j = 0;if (i < remainder)j = 1;remainderToBinary = remainderToBinary + j;}int sublast = Integer.valueOf(remainderToBinary, 2);masks[index] = sublast;if (index < masks.length - 1) {for (int i = index + 1; i < masks.length; i++)masks[i] = 0;}return masks;}/*** 分解ip地址* @param ip  ip地址* @return      长度为4的int数组*/private static int[] getIpv4Array(String ip) {int[] ipArray = new int[4];String[] ips = ip.split("\\.");for (int i = 0; i < ips.length; i++) ipArray[i] = Integer.parseInt(ips[i]);return ipArray;}/*** 通过子网掩码数组和,ip地址数组获取主机地址* @param masks     子网掩码数组* @param ipArray ip数组* @return      主机地址*/private static String getSubnet(int[] masks, int[] ipArray) {String subnet = "";if (masks.length != ipArray.length) {try {throw new Exception("子网掩码长度和ip地址长度不一样");} catch (Exception e) {e.printStackTrace();}}for (int i = 0; i < ipArray.length; i++) {int and = masks[i] & ipArray[i];subnet = subnet + and;if (i < ipArray.length -1) subnet = subnet + ".";}return subnet;}

所以,那些带掩码的ip,代表的是在该主机下的所有地址,/25,表示有128个地址,这时就需要计算来得到,而不是简单的字符串匹配!

企业号的就号很多,全部是.*,所以只需要判断前3个数字就可以了!

微信服务器IP地址详解,并判断该地址是否来自微信相关推荐

  1. 史上最全的IP地址详解,速来get

    史上最全的IP地址详解 白在了解虚拟机网络之前,我们首先得了解ip地址是什么? 1.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的 ...

  2. 第2节 网络及IP地址详解

    网络及IP地址详解 0概述 1基本概念及其连接关系 1.1基本概念 1.2连接关系示意图 2处理不同访问的逻辑顺序 2.1局域网内部不同机器间的访问 2.2局域网内主机通过IP地址访问JD服务器 2. ...

  3. 基础知识(一),ip地址详解、网关、DNS、进制转换、DOS命令、批处理、用户和组管理、telnet、RDP、NTFS、CIFS

    基础知识: 企业 >enterprise 专业 >profession 服务器 >server 客户端 >client 浏览器 >Browser B/S 架构:服务器对应 ...

  4. 网络安全基础——2.IP地址详解

    IP地址详解 局域网的介绍 IP地址 子网掩码 IP地址的分类 网关 DNS 网络测试命令 局域网的介绍 1.局域网:一般称为内网 2.简单局域网的构成:交换机.网线.PC(其他IT终端) 3.交换机 ...

  5. IP地址详解(扫盲篇)

    局域网:一般称为内网. 简单局域网构成:交换机.网线.PC(其他IT终端). 交换机:用来组建内网的设备. IP地址 IP地址就是一个唯一标识,是一段网络编码(二进制). IP地址形式:X.X.X.X ...

  6. IP地址中的A、B、C类地址详解

    IP地址中的A.B.C类地址详解 IP地址分类 IP地址共分为五类,依次是A类.B类.C类.D类.E类,如图7-5所示.其中在互连网中最常使用的A.B.C三大类,而D类主要用于广域网比较多一点,作用用 ...

  7. 网络字节序和IP地址详解

    文章目录 一.网络字节序 1.大端模式和小端模式 2.判断大端模式和小端模式 3.大端模式和小端模式相互转换 二.字节序转换函数 三.IP地址详解 1.IP地址的概念 2.IP地址的两种表示方法:整数 ...

  8. IP地址和子网划分学习笔记之《IP地址详解》

    在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...

  9. 【Network Security!】IP地址详解(看不懂你来打我)

    文章目录 一.简单局域网的构成 二.IP地址 1.IP地址规则 三.子网掩码 四.IP地址详解 1.分类 2.案例1 3.案例2 五.网关 六.DNS 七.配置IP地址 八.网络测试命令 一.简单局域 ...

最新文章

  1. PCB差分走线的阻抗控制技术(一)
  2. 使用WebBrowser与msHtml开发WinForms下的HtmlEditor控件
  3. 汤家凤高等数学基础手写笔记-一元微分学的应用
  4. 类型两个数相减_小学数学简便计算12种分类+5种易错类型,打印出来给孩子练习!(可打印!)...
  5. 如果用中文编程....那么... (如果..那么...这搭配很完整吧)
  6. 设计模式之模板方法和策略模式的区别(一)
  7. oracle 性能诊断工具,oracle性能诊断工具
  8. python 安装包查询_Linux系统下查找安装包所在目录
  9. python itertools combination_Python itertools.combinations 和 itertools.permutations 等价代码实现...
  10. Firefox 67不能勾选“以后自动采用相同的动作处理此类文件”解决方案
  11. Android-传感器开发
  12. android读取主板数据恢复,重磅干货!高通9008模式与数据提取用于恢复数据
  13. MEM专业学位论文选题与研究设计
  14. 按键精灵 获取某网站服务器时间,按键精灵如何获得网络时间的毫秒
  15. 一个逻辑问题的分析:“天堂与地狱的守卫”
  16. text生成pdf之ctexwineditmiktexgbk2uni的安装使用方法
  17. Cocos2d-x3.2刀塔创奇三消游戏源码,跑酷游戏源码,塔防游戏源码
  18. 流程图文字及数据表内外连接
  19. Python画四张子图-导入数据
  20. 沉痛悼念互联网[云原生领域]技术大牛----左耳朵耗子(陈皓老师)

热门文章

  1. CAD建筑结构图绘制之散水
  2. 德国GREISINGER 真空压力表GDH 200-14 德国 rubsamen 风扇 herr 10 535 150 lv500 230v 50/60hz
  3. 搜索引擎:Frame of Reference 和 Roaring Bitmaps
  4. 浅析汽车抵押贷款业务
  5. JDK、IDEA等安装详解
  6. 欧洲十大电动摩托车市场-Part two
  7. OBS视频数据输出流程(模块加载,编码,推流)详细说明
  8. git 第一次push error: failed to push some refs to
  9. PXE批量装机详细教程
  10. 一天一点linux(6)