关注小编微信公众号公众号【前端基础教程从0开始】回复“1”,拉你进程序员技术讨论群,群内有大神,可以免费提供问题解答。公众号回复“小程序”,领取300个优秀的小程序开源代码+一套入门教程。公众号回复“领取资源”,领取300G前端,Java,产品经理,微信小程序,Python等资源合集大放送,让我们一起学前端。

https可以防止http劫持,但是无法防止dns劫持,因为dns劫持发生在你和web 服务器建立连接之前。

打个比方,你要#去超市买东西,dns是出租车,把你送到超市门口(web服务器),https能防止超市给你的商品里加了假货,但是你一开始就上了黑车(dns劫持)!后面的就不可能会发生了!

防止dns劫持,很难,尤其对于小运营商的用户,被劫持的概率非常大。如果你认为用户只要使用8.8.8.8或者119.29.29.29等公共dns就可以避免劫持,那说明你还没发现运营商有多险恶,他们甚至在网关处伪造dns应答,抢答了目标递归dns给你的应答。看你的提问,是站在网站服务提供者的角度来问的,那就更难了,还是上面那个例子,你作为一个超市,想要防止客人被黑车拐跑,你觉得可能吗?我提供三种思路:

第一个(我没试过),发现网站在某些地区运营商被劫持了,投诉工信部,让他们放开劫持。

第二个,选用cdn服务。大部分小运营商dns劫持,是由于你的网站流量大,而源站又在网外,他们为了避免产生高额的网间结算费用,将被网内的dns请求劫持到网内他们自己的缓存服务器集群里。如果你用了cdn,被劫持的概率会略有下降,因为cdn厂商大多节点很多,以我司为例,国内几乎无孔不入,既然都在网内,他们就不会盯上你。即使被劫持,cdn厂商凭借和小运营商良好的沟通渠道(至少我司是这样,经常一个电话或者社交软件上和对方负责人说一句就会放开了),也很容易放开劫持。

第三个,选用httpdns,利用腾讯httpDns应对dns劫持来举例:

主要有三个步骤

1、自制DNS服务器,监听127.0.0.1:53
2、修改网络连接里面的首选DNS服务器为:127.0.0.1
3、服务器收到DNS请求后,从腾讯的httpDns接口查询,再返回给请求端,接口:http://119.29.29.29/d?dn=域名

防劫持源码地址:

https://gitee.com/fz6/mobile_h5_antihijacking
代码:

import hpsocket;
import hpsocket.udpServer;
import wsock;
namespace hpsocketclass dnsServer{ctor(initFile, dnsApp ){this = ..hpsocket.udpServer()if(!this){return null; }this.threadGlobal = {_dnsApp = dnsApp;_initFile = initFile;response = {};request = {};}this.onThreadCreated = function(){import web.json;import hpsocket.dnsServer;import console;log=function(...){console.dump(...)}if(_initFile){loadcodex(_initFile)}response.close = function(){if(owner.resultStr and #owner.resultStr){hpUdpServerEx.send(connId,owner.resultStr,#owner.resultStr)}owner.resultStr = "";}response.write = function(s,...){if( s === null ) return;var ts = type(s);if( ts == 'table' ){if(s[["_struct"]]) {if( s@[["_tostring"]] ) s = tostring(s); }else s = web.json.stringify(s,owner.jsonPrettyPrint);}elseif( (ts != 'string') && (ts != 'buffer') ){s = tostring(s);};owner.resultStr ++= s;s = null;ts=nullif(...===null) return;return owner.write(...);}response.loadcode = function(path){loadcodex( path );}global.print = function(...){response.write(...);};}this.onReceive = function(hpUdpServerEx,connId,pData,length){global.hpUdpServerEx = hpUdpServerEx;global.connId = connIdif(_dnsApp){request.body = ..raw.tostring(pData,1,length)request.domains = hpsocket.dnsServer.dealDNSbyte(request.body);response.resultStr = "";_dnsApp(request,response);response.close();}}};
}namespace dnsServer{class TDNSBitCode{Word QR=0; //Query/Response FlagWord OpCode=0; //Word AA=0; //Authoritative Answer FlagWord TC=0; //Truncation FlagWord RD=0; //Recursion DesiredWord RA=0; //Recursion Available:Word Z=0; //ZeroWord RCode=0; //Response Code}class TDNSHeader{Word ID=0; //Identifier:Word BitCode=0; //从中分析出TDNSBitCodeWord QDCount=0;Word ANCount=0;Word NSCount=0;Word ARCount=0;}class dns_packet{WORD Id=0;WORD Flags=0;WORD Questions=0;WORD Answers=0;WORD Authoritys=0;WORD Additionals=0;}   class DnsQuery{Word TheType=0;    //记录类型 A NS CNAMEWord TheClasses=0;}class DnsResponse{Word TheName=0;Word TheType=0;Word TheClasses=0;INT ttl=0;Word length=0;INT addr=0;}GetDNSBitCode = function( BitCode){var result = TDNSBitCode();result.QR = BitCode >> 15;result.OpCode = ((BitCode & 0x7800) >> 11) & 0x000F;result.AA = (BitCode & 0x0700) >> 10;result.TC = (BitCode & 0x0200) >> 9;result.RD = (BitCode & 0x0100) >> 8;result.RA = (BitCode & 0x0800) >> 7;result.Z = 0;result.RCode = BitCode & 0x000F;return result; }DNSStrToDomain = function(SrcStr, Idx){var Result = '' ;var fRPackSize = #SrcStr;var SavedIdx = 0;do{var Len = SrcStr[Idx];while( (Len & 0xC0)==0xC0 ){if (SavedIdx == 0){SavedIdx = Succ(Idx)}var aChar = Len & 0x3F;Idx = twoCharToWord(aChar, SrcStr[Idx + 1]) + 1;Len := SrcStr[Idx]; }if (Idx >= fRPackSize){return ; }var LabelStr='';if (Len > 0){LabelStr = ..string.sub(SrcStr,Idx+1,Idx+Len);Idx += Len+1;}if (Idx+1 > fRPackSize){return ; }Result ++=  LabelStr ++ '.';}while(!(SrcStr[Idx] == 0 or Idx > #SrcStr))if (Result[#Result] == '.'#){Result = ..string.left(Result,#Result-1)}if (SavedIdx > 0){Idx = SavedIdx}Idx++;return Result, Idx; }long2str=function(src,len=2){if(type(src)==type.number){var bytesif(len==2){bytes = ..raw.convert({WORD n=src},{BYTE s[2]={}});}elseif(len==4) {bytes = ..raw.convert({INT n=src},{BYTE s[4]={}});}elseif(len==8) {bytes = ..raw.convert({LONG n=src},{BYTE s[8]={}});}return ..string.pack(bytes.s)//..raw.malloc(#bytes.s,bytes); }}BuilderDNSResponse = function(pDnsQuery, nQueryLen, SnoopIP){if(pDnsQuery){var dnsr = dns_packet();var dnslen =  ..raw.sizeof(dnsr);var dnss = dns_packet();var queryr = DnsQuery();var str = ..string.left(pDnsQuery,dnslen);..raw.convert(str,dnsr);//标识字段dnss.Id := dnsr.Id;//标志字段,其中设置了QR = 1,RD = 1,RA = 1dnss.Flags := ..wsock.htons(0x8180);//问题数量dnss.Questions := ..wsock.htons(1);if(type(SnoopIP)==type.table){//回答数量dnss.Answers := ..wsock.htons(#SnoopIP);}else {//回答数量dnss.Answers := ..wsock.htons(1);}dnss.Authoritys := 0;dnss.Additionals := 0;var querylen = ..raw.sizeof(queryr);var ulen = nQueryLen - dnslen - querylen;var start = dnslen+ ulenstart += 1;var dname = ..string.sub(pDnsQuery, dnslen+1, dnslen+ulen)str = ..string.sub(pDnsQuery, start, start+3)..raw.convert(str,queryr);start += 4;var responses = DnsResponse();var responselen = ..raw.sizeof(responses)var usBufferLenif(type(SnoopIP)==type.table){usBufferLen = start + responselen*#SnoopIP;}else {usBufferLen = start + responselen;}var result = ..raw.malloc(usBufferLen,dnss);var len = dnslen;len = ..raw.concat(result,dname,len,#dname);var queryr1 = ..raw.malloc(queryr);len = ..raw.concat(result,queryr1,len,#queryr1);if(type(SnoopIP)==type.table){for(i=1;#SnoopIP;1){//域名指针str = long2str(..wsock.htons(0xC00C));len =..raw.concat(result,str,len,#str);//0005 CNAME    str = long2str(queryr.TheType);len =..raw.concat(result,str,len,#str);//0001 类,表示为Internet数据str = long2str(queryr.TheClasses);len =..raw.concat(result,str,len,#str);//TTL 生存时间str = long2str(0x0000000A,4);len =..raw.concat(result,str,len,#str);//数据长度 127 0 0 1str = long2str(..wsock.htons(4));len =..raw.concat(result,str,len,#str);//内容 127 0 0 1str = long2str(..wsock.inet_addr(SnoopIP[ i ]),4);len =..raw.concat(result,str,len,#str);}}else {//域名指针str = long2str(..wsock.htons(0xC00C));len = ..raw.concat(result,str,len,#str);//0005 CNAME    str = long2str(queryr.TheType);len = ..raw.concat(result,str,len,#str);//0001 类,表示为Internet数据str = long2str(queryr.TheClasses);len = ..raw.concat(result,str,len,#str);//TTL 生存时间str = long2str(0xFFFFFFFF,4);len = ..raw.concat(result,str,len,#str);//数据长度 127 0 0 1str = long2str(..wsock.htons(4));len = ..raw.concat(result,str,len,#str);//内容 127 0 0 1str = long2str(..wsock.inet_addr(SnoopIP),4);len = ..raw.concat(result,str,len,#str);}return ..raw.tostring(result,0,len);    }}twoCharToWord = function(b1,b2){return ((b1 << 8) & 0xFF00) | (b2 & 0x00FF)}dealDNSbyte = function(strRecvData){var id = twoCharToWord(strRecvData[1], strRecvData[2]);var Code = twoCharToWord(strRecvData[3], strRecvData[4]);var BitCode = GetDNSBitCode(Code);if( BitCode.QR != 0){return}; //0表示查询,1表示反馈var QDCount = twoCharToWord(strRecvData[5], strRecvData[6]);if (QDCount <= 0) {return } var APos = 13; // DNS头恒为12字节var DomainNamevar domains = {}for(i=1;QDCount;1){DomainName,APos = DNSStrToDomain(strRecvData, APos);if (!DomainName){return  };var QueryType = twoCharToWord(strRecvData[APos], strRecvData[APos + 1]);APos += 2;var QueryClass = twoCharToWord(strRecvData[APos], strRecvData[APos + 1]);APos += 2;..table.push(domains,DomainName);}return domains; }
}

移动端h5页面会被植入广告问题解决相关推荐

  1. 移动端H5页面编辑器开发实战--原理结构篇

    一.前言 在去年10月份左右,接到了需求:开发一个H5移动端页面编辑器的任务,目的主要是解放公司内在制作这类网页的所投入的人力以及解决使用外部H5编辑器所涉及到的版权问题. 因此,一款能够与市面上已经 ...

  2. 【通用CSS模板】移动端H5页面统一样式.css

    /*移动端H5页面统一样式----------------------------------------*/ @charset "UTF-8"; body, html, li, ...

  3. 移动端H5页面高清多屏适配方案

    背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...

  4. 教你如何用 lib-flexible 实现移动端H5页面适配

    前话 好久没写教程了(可能会误导新手的菜鸟教程( ̄▽ ̄)"). 这是我的github,欢迎前端大大们和我一起学习交流 https://github.com/pwcong 最近入职公司做前端实 ...

  5. php清除h5格式,移动端H5页面端怎样除去input输入框的默认样式

    这次给大家带来移动端H5页面端怎样除去input输入框的默认样式,移动端H5页面端除去input输入框的默认样式的注意事项有哪些,下面就是实战案例,一起来看一下. 前两天在开发在微信访问的HTML5页 ...

  6. html5首页图标怎么除掉,移动端H5页面端如何除去input输入框的默认样式

    移动端H5页面端如何除去input输入框的默认样式 发布时间:2020-09-29 16:41:58 来源:亿速云 阅读:124 作者:小新 这篇文章主要介绍了移动端H5页面端如何除去input输入框 ...

  7. m3u8 video ios h5_移动端H5页面踩坑记

    移动端H5页面踩坑记 移动端的样式问题 「1. 安卓 font-weight:700;以上才被认为是加粗.」 「2. border 在 1px 以内是不被安卓识别的一些 0.5px 的下划线怎么搞?」 ...

  8. h5页面生成图片分享到微信js_微信端h5页面如何调用分享页面的接口

    这次给大家带来微信端h5页面如何调用分享页面的接口,微信端h5页面调用分享页面接口的注意事项有哪些,下面就是实战案例,一起来看一下. 最近公司做了一个给学生投票的H5页面,主要是在微信端使用,需要添加 ...

  9. 移动端web设计尺寸_移动端H5页面的设计稿尺寸大小规范

    当我们在做手机端H5网页设计稿时(当然包含微信端的H5网页设计),如果没有做过类似的移动端的设计,UI设计师和前端工程师肯定会纠结的.如果是app设计师,就不会那么纠结啦. 那么多手机屏幕尺寸,设计稿 ...

最新文章

  1. 2018-3-21李宏毅机器学习视频笔记(十三)--“Hello Wrold” of Deep learning
  2. 单团队敏捷开发项目管理示例
  3. iOS视图控制器之间delegate传值
  4. [JavaScript Java] 初识Closure Tools(一)
  5. Git 忽略一些文件不加入版本控制
  6. 2021 最流行的十大项目,新项目居榜首,总有长江后浪推前浪!
  7. 使用docker构建并测试一个基于Sinatra的Web应用程序
  8. C++之map插入数据相同的key不能覆盖value解决办法
  9. leetcode343. 整数拆分(dp)
  10. 童家旺:如何用分表存储来提高性能
  11. 修改Extmail和Extman的源代码增加公司部门和中文名字段
  12. JAVA 8 LIST<对象> 转换SET
  13. C# 线程手册 第四章 线程设计原则 对等线程模型
  14. Win32中GDI+应用(一)
  15. xp配置iis和php,XP下让IIS支持PHP
  16. python拍照搜题_OCR拍照搜题
  17. 阿里用的java编码规范积累
  18. Mobile GMaps - Google Map移动版
  19. csapp attack lab
  20. 6.lambda表达式

热门文章

  1. 【财富空间】古训:谋者胜于计,勇者胜于胆,智者胜于藏
  2. sqlserver查看表架构修改历史记录
  3. BUGKU MSIC 想蹭网先解开密码 wp
  4. 【云原生】解决在Windows上在docker内启动docker报Operation not permitted
  5. VUE3:使用复制插件出现element.hasAttribute is not a function
  6. Hessian/Burlap: is an unknown class in WebappClassLoader
  7. 手把手教你如何建立自己的Linux系统(LFS速成手册)
  8. 灵魂发问power bi中的Calculate函数到底是什么?
  9. Java随机生成n天的体温
  10. gif转换为ASCII艺术