1、文章背景

在客户端进行业务接口请求时,往往会在线上出现解析JSON响应内容失败而导致的应用崩溃,但是在实际开发测试过程中却没有遇到此问题。解决办法就是对JSON解析进行异常捕获,然后将实际响应内容上报到服务端,从而查看具体问题。

对上报到服务端的实际响应内容进行分析后,发现响应内容变成各种html文本,以下是常见的几种:

1、安全DNS服务门户:Fortinet Secure DNS Service Portal

<html> <head>   <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />   <title>Fortinet Secure DNS Service Portal</title>  </head>  <body>   <center>    <h2>Web Page Blocked!</h2> You have tried to access a web page which belongs to a category that is blocked.   </center>   </body></html>

2、安全软件重定向:SHP Redirector

<!DOCTYPE html><html> <head>   <title>SHP Redirector</title>   <meta charset="UTF-8" />   <meta name="description" content="SHP Redirector" />   <script type="text/javascript" src="http://shgw.router:8080/ids.js"></script>   <script src="http://blockpg.lion.shp.mcafee.com/blockpage/third-party/jquery-3.3.1.min.js"></script>   <script src="http://blockpg.lion.shp.mcafee.com/blockpage/js/redirector1.1.js"></script>  </head>  <body>   <div id="settings" blockpage="http://blockpg.lion.shp.mcafee.com/blockpage/?" server="xxx.xxx.xxx">    </div> </body></html>

3、运营商广告劫持:

https://www.twmbroadband.com

<html> <head>  <meta charset="big5" />  <title></title>  <style><!-- A{text-decoration:none} --></style>  <script src="/redirect/js/jquery-1.6.2.min.js"></script>  <script>function btnSub(btnId){ $("#accept_redirect").append("<input type='hidden' name='btnId' value="+btnId+" />"); $("#accept_redirect").submit(); } $(document).ready(function() { $(window).bind("beforeunload", function() { $("form").submit(); }); });  </script> </head> <body>  <div align="center">   <form id="accept_redirect" name="accept_redirect" method="post" action="php_bin/recovery_sub.php">    <div>     <input type="hidden" name="url" value="" />     <input type="hidden" name="system" value="NX" />     <input type="hidden" name="so" value="PHC" />     <input type="hidden" name="flag" value="1" />     <input onclick="btnSub(1);" value="線上刷卡" type="button" style="font-size:16px;height:6%;width:30%; margin : 80px;margin-bottom : 5px;margin-top : 5px;" />     <input type="hidden" value="https://www.twmbroadband.com/T01/service-online-payment_5_1062_1113.html" name="url1" id="url1" />     <input onclick="btnSub(2);" value="我已閱讀此網頁,回到我要去的網頁" type="button" style="font-size:16px;height:6%;width:30%; margin : 80px;margin-bottom : 5px;margin-top : 5px;" />    </div>    <div>     <img src="/redirect/images/R1_PHC_pc.jpg" style="height: 80%;width: 80%; margin : 5px;" />    </div>    <div></div>   </form>  </div> </body></html>

以上几种均是DNS劫持导致的结果,想知道DNS是如何被劫持的,需要先理解DNS域名是如何解析的。

2、DNS域名解析过程

当用户在浏览器地址栏输入域名时,DNS解析有大致十个过程:

1、浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。

2、如果浏览器缓存中没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程,即通过hosts文件来设置,如果在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。

3、如果至此还没有命中域名,才会真正地请求本地域名服务器(LDNS)来解析这个域名。

4、如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析。

5、根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址。

6、此时LDNS再发送请求给上一步返回的gTLD。

7、接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。

8、Name Server根据映射关系表找到目标ip,返回给LDNS。

9、LDNS缓存这个域名和对应的ip。

10、 LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。

(图片来自知乎@寒夜客来)

缓存是DNS被劫持的根本原因,在DNS解析过程的各个缓存中均有可能被劫持。主要包括本机的hosts篡改劫持,和运营商的Local DNS劫持等。

3、HTTPNS防止域名劫持

HttpDNS是使用HTTP协议向DNS服务器的80端口进行请求,代替传统的DNS协议向DNS服务器的53端口进行请求。也就是使用Http协议去进行DNS解析请求,将服务器返回的解析结果,直接向该IP发起对应的API服务请求,代替使用域名。

域名解析请求直接发送到HTTPDNS服务器,绕过运营商Local DNS,避免域名劫持问题。

HTTPDNS在阿里云和腾讯云服务器均有支持,读者们可以在其官网中自行查看了解。

4、推荐阅读

从代码上看鸿蒙 APP 与安卓 APP 的关系

Android 记一次解决问题的过程

webview内存泄漏终极解决方案

Android 一套完整的 Socket 解决方案

Android Fragment 被回收后显示空白问题解决方案


如果你有写博客的好习惯
欢迎投稿

点个在看 你最好看

解决 Android 中的 DNS 域名劫持问题相关推荐

  1. 如何使用OpenDNS有效解决DNS域名劫持?

    如何使用OpenDNS解决DNS域名劫持?很多用户都有遇到过DNS域名被劫持的情况,遇到域名被劫持,最好的解决办法就是使用国外更为安全可靠的DNS服务器,这里小编推荐大家使用OpenDNS提供的DNS ...

  2. 网络安全:、dns被劫持怎么解决DNS域名劫持的几种解决方法

    dns的快慢与稳定与否,关系着浏览时的正常;更有甚者,dns的健康与否,更会直接影响各个拨号客户端的健康. 现在国内上网的用户,大多家用的都是用的网通或者电信的adsl,这中间还分各省地区的拨号服务器 ...

  3. 【转载】全面了解移动端DNS域名劫持等杂症

    原文链接:http://www.52im.net/thread-2121-1-1.html 0 前言 之前在公司的项目中,引入了HttpDNS,但是有很多同事对HttpDNS的原理不是很了解,之前分享 ...

  4. 全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等

    1.引言 对于互联网,域名是访问的第一跳,而这一跳很多时候会"失足"(尤其是移动端网络),导致访问错误内容.失败连接等,让用户在互联网上畅游的爽快瞬间消失. 而对于这关键的第一跳, ...

  5. Linux:设置/修改linux主机名+hosts映射+主机名解析机制分析+DNS域名劫持

    设置/修改主机名 查看主机名hostname,修改主机名(在vim编译器里修改),重启命令(reboot),操作如下: 结果如下: 设置hosts映射: 操作意义:ip地址很长,不好记忆,直接记忆主机 ...

  6. 解决 Android 中出现依赖多个版本支持库的问题

    解决 Android 中出现依赖多个版本支持库的问题 参考文章: (1)解决 Android 中出现依赖多个版本支持库的问题 (2)https://www.cnblogs.com/lshare/p/1 ...

  7. 解决Android中的ERROR: the user data image is used by another emulator. aborting的方法

    解决Android中的ERROR: the user data image is used by another emulator. aborting的方法 今天调试代码的时候,突然出现这个错误,折腾 ...

  8. Android中DNS域名劫持问题-解决方案

    前言 在客户端进行业务接口请求时,往往会在线上出现解析JSON响应内容失败而导致的应用崩溃,但是在实际开发测试过程中却没有遇到此问题.解决办法就是对JSON解析进行异常捕获,然后将实际响应内容上报到服 ...

  9. DNS域名劫持的几种解决方法

    现在国内上网的用户,大多家用的都是用的网通或者电信的adsl,这中间还分各省地区的拨号服务器,dns(Domain Name System)就成了上网时,很关键的一环,dns的快慢与稳定与否,关系着浏 ...

  10. 使用OpenDNS解决DNS域名劫持

    对于这次遇到的大规模域名劫持到百度网站的情况,有一个很简单的办法进行解决,就是使用国外更为安全可靠的DNS服务器进行域名解析,可以避免被本地电信或网通进行域名劫持. 我推荐大家使用OpenDNS提供的 ...

最新文章

  1. 创建新的用户以及一系列的操作
  2. Pytorch实践中的几个重要概念
  3. python中文意思k-python中“//”表示什么意思_后端开发
  4. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结
  5. OpenGL deferred shading延迟渲染的实例
  6. 940mx黑苹果驱动_超详细黑苹果安装图文教程送EFI配置合集及系统
  7. PE文件格式(加密与解密3)(一)
  8. mysql用supervisor管理_Supervisor使用详解
  9. BugkuCTF-WEB题bp
  10. 森海塞尔Momentum 2无线蓝牙耳机发布:首次加入主动降噪
  11. 安卓应用市场分类排名算法一般是怎样的?
  12. faster-RCNN台标检测
  13. PSCAD v4.21-ISO
  14. ibm服务器硬件故障检测工具,IBM服务器故障提示Memory/bttery problems were detected
  15. 单片机算法c语言程序,51单片机PID的算法实现程序C语言
  16. php 生成pdf 图片转pdf
  17. 一款值得使用的,免费会议室管理软件【微信小程序和网页版都有】
  18. 大数据工程师的日常工作是什么?要掌握哪些核心技术?
  19. excel解决日期数据无法正常筛选
  20. 魅族 -- 禁止D及以下级别LOG的输出

热门文章

  1. 基于QT实现的图形软件图片编辑器
  2. 接口规范性测试标准规范—详细
  3. 数据库中delete和drop的区别
  4. (详细步骤)申请twitter api
  5. MindManager2018,修改下载时间
  6. Python美化桌面—自制桌面宠物
  7. jquery点击事件写法
  8. 配对和非配对t检验的差异
  9. 多家波卡生态项目招聘开发者,高薪职位等你来 Pick
  10. Python爬取新东方在线网站大学英语六级词汇