微信服务器IP地址详解,并判断该地址是否来自微信
公众号官网说明:点击进去官方文档
如果公众号基于消息接收安全上的考虑,需要获知微信服务器的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地址详解,并判断该地址是否来自微信相关推荐
- 史上最全的IP地址详解,速来get
史上最全的IP地址详解 白在了解虚拟机网络之前,我们首先得了解ip地址是什么? 1.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的 ...
- 第2节 网络及IP地址详解
网络及IP地址详解 0概述 1基本概念及其连接关系 1.1基本概念 1.2连接关系示意图 2处理不同访问的逻辑顺序 2.1局域网内部不同机器间的访问 2.2局域网内主机通过IP地址访问JD服务器 2. ...
- 基础知识(一),ip地址详解、网关、DNS、进制转换、DOS命令、批处理、用户和组管理、telnet、RDP、NTFS、CIFS
基础知识: 企业 >enterprise 专业 >profession 服务器 >server 客户端 >client 浏览器 >Browser B/S 架构:服务器对应 ...
- 网络安全基础——2.IP地址详解
IP地址详解 局域网的介绍 IP地址 子网掩码 IP地址的分类 网关 DNS 网络测试命令 局域网的介绍 1.局域网:一般称为内网 2.简单局域网的构成:交换机.网线.PC(其他IT终端) 3.交换机 ...
- IP地址详解(扫盲篇)
局域网:一般称为内网. 简单局域网构成:交换机.网线.PC(其他IT终端). 交换机:用来组建内网的设备. IP地址 IP地址就是一个唯一标识,是一段网络编码(二进制). IP地址形式:X.X.X.X ...
- IP地址中的A、B、C类地址详解
IP地址中的A.B.C类地址详解 IP地址分类 IP地址共分为五类,依次是A类.B类.C类.D类.E类,如图7-5所示.其中在互连网中最常使用的A.B.C三大类,而D类主要用于广域网比较多一点,作用用 ...
- 网络字节序和IP地址详解
文章目录 一.网络字节序 1.大端模式和小端模式 2.判断大端模式和小端模式 3.大端模式和小端模式相互转换 二.字节序转换函数 三.IP地址详解 1.IP地址的概念 2.IP地址的两种表示方法:整数 ...
- IP地址和子网划分学习笔记之《IP地址详解》
在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...
- 【Network Security!】IP地址详解(看不懂你来打我)
文章目录 一.简单局域网的构成 二.IP地址 1.IP地址规则 三.子网掩码 四.IP地址详解 1.分类 2.案例1 3.案例2 五.网关 六.DNS 七.配置IP地址 八.网络测试命令 一.简单局域 ...
最新文章
- PCB差分走线的阻抗控制技术(一)
- 使用WebBrowser与msHtml开发WinForms下的HtmlEditor控件
- 汤家凤高等数学基础手写笔记-一元微分学的应用
- 类型两个数相减_小学数学简便计算12种分类+5种易错类型,打印出来给孩子练习!(可打印!)...
- 如果用中文编程....那么... (如果..那么...这搭配很完整吧)
- 设计模式之模板方法和策略模式的区别(一)
- oracle 性能诊断工具,oracle性能诊断工具
- python 安装包查询_Linux系统下查找安装包所在目录
- python itertools combination_Python itertools.combinations 和 itertools.permutations 等价代码实现...
- Firefox 67不能勾选“以后自动采用相同的动作处理此类文件”解决方案
- Android-传感器开发
- android读取主板数据恢复,重磅干货!高通9008模式与数据提取用于恢复数据
- MEM专业学位论文选题与研究设计
- 按键精灵 获取某网站服务器时间,按键精灵如何获得网络时间的毫秒
- 一个逻辑问题的分析:“天堂与地狱的守卫”
- text生成pdf之ctexwineditmiktexgbk2uni的安装使用方法
- Cocos2d-x3.2刀塔创奇三消游戏源码,跑酷游戏源码,塔防游戏源码
- 流程图文字及数据表内外连接
- Python画四张子图-导入数据
- 沉痛悼念互联网[云原生领域]技术大牛----左耳朵耗子(陈皓老师)
热门文章
- CAD建筑结构图绘制之散水
- 德国GREISINGER 真空压力表GDH 200-14 德国 rubsamen 风扇 herr 10 535 150 lv500 230v 50/60hz
- 搜索引擎:Frame of Reference 和 Roaring Bitmaps
- 浅析汽车抵押贷款业务
- JDK、IDEA等安装详解
- 欧洲十大电动摩托车市场-Part two
- OBS视频数据输出流程(模块加载,编码,推流)详细说明
- git 第一次push error: failed to push some refs to
- PXE批量装机详细教程
- 一天一点linux(6)