使用网页元素随机化方法的广告反屏蔽系统
2020-05-14韦俊琳段海新季姝廷张皓宇
韦俊琳,段海新,白 宇,季姝廷,张皓宇
1(清华大学 网络科学研究院 网络空间安全实验室,北京 100084)
2(北京百度网讯科技有限公司,北京 100085)
3(天津市大数据管理中心,天津 300221)
E-mail:weijl6819@gmail.com
1 引 言
互联网在长期的发展中,形成一种稳定的用户与网站之间的商业模式.该商业模式存在隐藏协议,由网站为用户提供“免费”内容信息,而广告作为“免费”内容的价格[1].互联网的飞速发展得益于该商业模式提供的双赢场景,在线用户以极低的成本访问由广告赞助的免费网站内容服务,而广告流量作为网站提供服务的补助收入,进一步激励网站提供更多优质的内容,该商业模式下的隐藏协议对于网站的可持续发展有着积极的作用[2].在互联网时代,广告是众多互联网公司的主要收入来源之一,如Facebook、Google、Twitter、腾讯和百度等.根据2018年各互联网公司年度收入报告,谷歌的广告收入高达307.2亿美元、阿里巴巴广告年收入约为218.1亿美元、百度广告收入占比虽然占比下滑,但广告收入仍超过百亿美元,广告收入超过80%以上的占比,它为互联网产业的发展做出了不小的贡献.广告就像税收,没人喜欢,但它们的存在却是必要的.广告作为信息传播的主要工具,积极为品牌做推广,为新品牌做宣传,不断催化商业市场进步,在促进经济发展方面起着积极向上的作用.
广告市场由于缺乏有效的市场监督管控方法,会出现投放虚假广告和跟踪用户行为等威胁用户信息安全的行为[3].广告行业利润庞大,很难避免部分商家投放恶意广告,广告行业需要一定的监管方案,如果监管不到位,就会威胁用户的信息安全.ADBlock Plus的正式上线,作为广告拦截器对打击恶意广告投放起到了积极的作用,但封杀正规广告的行为却严重影响了互联网长期稳定发展所形成的用户与网站的商业模式.谷歌浏览器也在2018年推出内置广告拦截功能,要求只能展示符合其定义的标准规范的广告.而且广告拦截器的发展方向也发生了变化,广告屏蔽器的种类层出不穷,拦截广告内容很少区分是否为恶意广告,将拦截器认定为广告的内容一律拦截[4].广告拦截器的出现严重破坏了网站为用户“免费”提供内容的商业模式,对在线广告生态系统造成了巨大的威胁[5].广告拦截器的兴起给在线网络服务带来了一些潜在威胁,这可能会严重影响通过广告补贴网站向用户免费提供的内容商业模式[6].
广告供应商面对广告拦截器处于被动,绝大部分依赖广告收入的互联网公司都备受打击,广告供应商需要采取主动的方式对抗广告拦截器对广告的拦截.ADBlock Plus为首的广告拦截器的使用用户比例较高,而且呈现持续增长的态势,导致广告供应商投放的广告展示成功率大幅度下降.反广告拦截研究对广告供应商成功投放广告,挽回广告损失至关重要.不同网站应用的反广告拦截方案不同,目前的大部分网站所采用的反广告拦截方案是通过检测广告拦截器的存在,提示用户关闭或提供不同的网站内容,这种方案相当于将选择权交给用户,放弃了和广告拦截器的对抗,不利于广告行业的持续发展.利用WebSocket绕过广告拦截器的方法在广告拦截器新增了对WebSocket的检测后也难以继续生效.而且目前研究领域对广告拦截的研究偏多,而反广告拦截的研究则偏少,呈现明显的不对等性.对广告供应商而言,反广告拦截的存在至关重要,广告供应商需要采用主动的方式对抗广告拦截器[7-9].
本文深入研究有效的广告反屏蔽技术,借助CDN系统搭建广告反屏蔽系统,旨在提高广告展示的成功率,增加广告供应商的收益.首先对最主流的广告拦截器 ADBlock Plus 进行研究,深入分析拦截器对广告的拦截原理.在充分了解广告拦截器拦截广告原理的基础上采取针对性防护方案,对广告元素资源地址进行加密,对抗广告拦截器对资源请求的特征匹配;对元素属性进行随机化,对抗广告拦截器对元素属性的规则检测.本文使用CDN系统搭建的广告反屏蔽系统,不需要广告服务器改变就能实现对抗广告拦截的效果,实现了对广告服务器的透明化,具有良好的兼容性和可扩展性.利用动态化的思想,对广告资源地址进行加密,加密的资源请求让广告拦截器无法通过匹配资源地址特征来检测广告请求,对元素属性名进行随机化,让广告拦截器通过属性名定位广告元素的方法失效.反广告屏蔽系统实际应用于百度反广告屏蔽,大幅度提高了百度联盟投放的广告的成功率.本广告反屏蔽方案应用于百度联盟,作为国内大型广告代理商,让正规广告能够正常展示,不为恶意广告商提供服务.
以下为本文的主要贡献:
1)分析总结广告拦截器对广告的拦截原理,将广告拦截器的主要功能划分为两个模块,广告资源请求拦截和广告元素隐藏
2)提出使用元素随机化的方法应对广告拦截器对广告内容的拦截,提出利用JavaScript代码动态执行的特性对静态元素和动态元素的随机化方案,提供了新的方法对抗广告拦截器,为广告供应商提供了新的广告反屏蔽方案
3)在百度CDN处搭建广告反屏蔽系统,并对系统进行广告请求对比测试,广告展示对比测试和广告上线运行测试.测试结果表明使用广告反屏蔽方案能够显著提高广告请求和广告展示的成功率,提升了百度联盟10%以上的广告展示成功量,带来了将近25亿的广告收入提升
本文第二节介绍相关工作,包括广告拦截器和广告反拦截器;第三节介绍广告反屏蔽系统模型,包括拦截器原理和广告反屏蔽系统架构;第四节介绍系统具体实现,从反屏蔽流程、静态元素和动态元素进行介绍;第五节介绍实验部分,对比测试广告请求成功率、广告展示成功率和实际上线对比测试;第六节对全文进行总结与展望.
2 相关研究
2.1 广告拦截器
目前最常用的广告拦截器包括ADBlock Plus、uBlock、Adguard和浏览器的内置拦截等.广告拦截器通过匹配广告请求、识别广告元素属性信息等方式选定广告元素,然后实施请求拦截和元素隐藏等拦截行为.广告拦截器对于清除恶意广告,为用户提供一个安全的上网浏览环境起着积极向上的作用,但广告拦截软件通杀广告的行为给广告市场带来了灭顶之灾.近年来发表的广告拦截器相关研究[11-19],主要在完善广告拦截器拦截列表做出贡献.根据Shitong Zhu等人的研究,为检测反广告屏蔽器,补充拦截列表做出了不小的贡献.而且根据Mohd Iskandar等人的研究结果,广告拦截器也在不断发展更新,向着DNS层演化.另一方面,广告拦截方推出了白名单机制,初衷是为了弥补广告拦截器的规则误判,但实际上白名单却成为了广告拦截方对广告商投放广告的变相收费.广告供应商如果想采用白名单的方式推出广告需要对广告模板及内容做很大的调整,广告模板的多样和广告业务内部的复杂让这种方式推动起来极为困难.而且广告拦截器种类繁多,让广告供应商满足所有的广告拦截器的方式并不可行.
2.2 广告反拦截
广告供应商为了能够减小广告投放效果的损失,需要探索有效的广告反拦截器的方法,广告供应商与广告拦截器之间展开了长期的对抗战.广告供应商和广告拦截器之间的矛盾冲突不可避免,如Facebook采用一系列改变广告投放方式的方法对抗广告拦截器;部分网站通过检查广告拦截器的存在而限制用户访问的内容,部分新闻网站如“金融时报”,“华尔街日报”等更是推出了付费特区提供无广告或订阅广告的服务;还有一些博客网站则是通过提示用户关闭广告拦截器来展示页面内容.据Rishab Nithyan等人在2016年对Alexa Top-5K进行检测,约有6.7%的网站存在反广告拦截器的存在[4];Umar Iqbal等人2017年采用Wayback Machine对Alexa top-5K的网站进行检测,检测结果显示约有9%的网站存在反广告拦截器[7];据Shitong Zhu等人在2018年采用差分分析对Alexa Top-10K的网站进行检测,结果表明30.5%的网站存在反广告拦截功能[8].网站采用反广告拦截的快速增长进一步验证了广告供应商和广告拦截器之间的战火持续升级.
广告反拦截技术形式多样,其中使用JavaScript检查当前用户是否使用广告拦截器,根据检测结果来调整网站服务模式可能会影响用户体验,不是最佳的选择方案.Weihang Wang等人提出了WebRanz[10]工具,使用URL随机化和内容随机化对抗广告拦截器,使得广告拦截器不能根据列表来识别广告内容,这为使用随机化技术对抗广告拦截开创了新思路.不过WebRanz系统需要在服务器端直接做较多修改,不利于系统的推广部署.另一种广泛使用的办法是使用WebSocket绕过广告拦截器对广告请求的监听[9],原因在于广告拦截器原有的监听方式无法监听WebSocket的请求,但当广告拦截器对WebSocket的请求进行监听后,该方法难以继续生效.
3 广告反屏蔽系统模型
广告供应商的广告模板种类繁多,需要一种对广告服务器透明的通用反屏蔽方案来应对广告拦截.鉴于目前网站及网站广告投放采用CDN系统进行缓存加速已经非常普遍,广告反屏蔽系统也在CDN系统进行搭建,以便于能够广泛部署和推广.
广告反屏蔽系统是在分析广告拦截器原理的基础上进行的,针对广告拦截器的原理采取针对性方案进行对抗.首先对广告拦截器的原理进行分析总结,找到广告拦截器对广告拦截的要点.广告反屏蔽系统充分应用随机化的思想来对抗广告拦截器,对抗要点一为通过对广告元素的资源地址进行加密来对抗广告拦截器对资源请求内容进行的特征匹配,对抗要点二为通过对广告元素的属性进行随机化来对抗广告拦截器对元素属性进行的特征匹配.
目前的广告屏蔽软件种类繁多,鉴于ADBlock Plus 在广告屏蔽市场中占据的绝对地位[3],本文对 ADBlock Plus 进行了深入分析,以寻求合适的对抗方法.ADBlock Plus 属于浏览器扩展,适用于Chrome、Safari、Firefox 等主流浏览器,通过使用浏览器为扩展开发提供的大量接口API,控制浏览器发出的所有请求和监控页面渲染的过程.经过分析发现,广告拦截器的第一道关隘为广告请求拦截.广告拦截器能够监管网站页面发出的资源请求,并从中提取出网站发出的所有资源请求,将提取出的资源请求与广告拦截器预先设置的规则列表进行匹配.如资源请求https://ad.domain.com/path/ad.png?query=ad&type=png 会被路径匹配规则 /*/ad.png^、域名匹配规则 ||ad.domain.com^ 等选中,标识为广告请求,然后阻断该资源请求.广告拦截器的第二道关隘为广告元素隐藏.广告拦截器通过向页面注入JavaScript脚本实施对页面元素的监控,使用 CSS3 Selecor 识别元素属性选取目标元素.如使用 ###ad 匹配 id 属性为 ad 的元素、使用 ##.ad 匹配 class 为 ad 的元素和使用##div[style="width:300px;height:250px;"]匹配 style 属性宽为300px,高为200px 的DIV元素等.在完成广告元素定位后,广告屏蔽器添加 display:none !important;以修改元素的状态,使广告元素隐藏.广告拦截器通过拦截请求和隐藏元素阻扰广告元素的正常展示,在标准的广告展示流程中设置关隘,对判定为广告的元素实施拦截.
图1 系统模型
鉴于广告拦截器根据资源请求的特征来识别广告请求和根据元素属性来识别广告元素,广告反屏蔽系统也对应分为对抗资源请求匹配和对抗元素属性匹配两部分主要功能.处理资源请求为对广告资源请求进行加密,处理元素属性为对元素属性名进行随机化.广告反屏蔽模型如图1所示,系统位于浏览器和广告服务器之间,适用于现今广泛应用的CDN系统,通过CDN系统与浏览器前端配合完成对资源请求的加密和对元素属性的随机化.广告反屏蔽系统在网站服务器返回的主页中插入JavaScript脚本,插入的脚本通过劫持DOM API完成对广告资源地址和元素属性的随机化.反屏蔽系统识别加密的资源请求,对加密的资源请求进行解密还原,保持对广告服务器的透明性.
4 广告反屏蔽系统实现
4.1 反屏蔽流程
广告反屏蔽系统的核心在于对目标元素使用随机化来应对广告拦截器对广告内容的识别.广告元素的成功展示主要分为两个步骤,资源请求和资源显示.广告拦截针对资源请求和资源显示两个方面做出了拦截,反屏蔽的要点也集中在了对目标元素地址和元素内容的保护.
广告反屏蔽系统对广告服务器保持透明化,采用中间件和浏览器前端配合的方式完成.前端首先通过中间件访问网站,中间件在获取网站页面后,在广告内容前插入反屏蔽脚本并对静态广告元素进行处理后,将修改后的页面发送给前端.前端接收中间件返回的网站内容后,首先执行反屏蔽脚本,脚本劫持 DOM 调用页面元素使用的接口,预设页面渲染过程中广告元素加载需要使用的参数.页面渲染时对广告资源请求进行加密.加密后的请求会发送到中间件,中间件对加密请求进行解密还原后发送到服务器,解密还原后的资源请求与未做反屏蔽处理前一致,不影响服务器正常工作流程.浏览器收到服务器返回的资源后进行显示,展示时对元素属性进行随机化,让广告屏蔽器对页面元素属性的检测失效.
上述流程实现对广告元素的随机化,对资源地址和元素属性内容进行随机化以扰乱广告拦截器对广告元素的拦截.但广告元素又分为静态元素和动态元素,在前端展示的方式不同,需要分别进行处理.
4.2 静态元素随机化
静态元素是指服务器端返回页面时就已经生成的元素,如图2所示,静态广告通常由内容发布者提供,通过中央域名展示广告.
图2 静态广告示例
本文提出了两种方案处理静态元素:方案一,在CDN处反向代理主页,解析页面定位目标广告元素,然后对广告元素进行随机化处理.在中间件处对服务器返回页面进行处理,使用Openresty 的第三方库Gumbo-lua 解析返回页面,将页面解析成DOM形式.然后遍历解析后的页面,定位目标元素位置,加密目标资源地址,最后将处理后的页面返回给浏览器端.本方案适用于可以临时存储完整页面的CDN系统,如果只能进行流式代理,则无法使用.方案二,不在CDN处进行页面解析,只在页面中插入JavaScript脚本,将对静态元素的随机化处理交给前端.在前端进行静态内容重加载,在页面添监听函数 window.onload = function(){…},该函数在DOM加载完成后执行.遍历页面完成后的元素,检查每个标签的 src/href 是否需要进行替换,如果需要替换,则进行下一步的加密替换,否则,不进行修改.对元素属性的处理需要进行预定义,指明需要进行随机化替换的目标元素.
4.3 动态元素随机化
动态元素是指服务器返回JavaScript代码,由客户端运行代码后生成的元素,如图3所示.动态广告通常由在线广告供应商或广告网络提供,托管在内容服务器上.与静态广告相比,它们可以由各种广告网络拥有的多个域提供.广告内容通常是动态加载的,并且每次加载时内容都可能不同.动态广告的展示需要加载不同的广告服务器资源才能成功,如果其中任何一个步骤被广告拦截器拦截,就会导致广告展示失败.广告拦截器监听所有的网站资源请求,会对请求的域名、路径、请求等参数进行特征识别,如果被判定为广告请求,则会拦截请求.
图3 动态元素生成方式
反屏蔽系统利用JavaScript代码动态加载的特性,劫持元素动态生成的赋值过程.如对id的赋值操作img.id = “ad_png”进行劫持,将新生成的id值变成随机字符串,消除元素属性名称的特征;对src的赋值操作进行劫持,对新生成的资源地址进行加密,消除资源地址中的特征.将JavaScript动态加载的特性应用于劫持元素属性赋值操作,图4所示为劫持img.id 的赋值操作,劫持后的id属性赋值操作都会先运行randomId函数才能生成.元素动态生成时,使用该方法对id、class和src等赋值操作进行劫持控制,让新生成的动态元素的属性值随机化,并对新生成的广告资源请求进行加密.
图4 JavaScript代码劫持控制
Fig.4 JavaScript hook control
对id、class的随机化会影响到JavaScript对页面元素的定位选取,需要进行额外修复以保障页面功能正常,如getElementById、getElementsByClass、querySelector等.修复示例如图5所示,重写document.getElementById函数,在自定义函数中通过随机化前后映射关系定位到元素位置,传给原始getElementById函数,以保障功能正常.
图5 元素定位修复
静态元素随机化的方案二也依赖于动态元素随机化,要点在于将静态元素转换成动态元素.在window.onload监听到页面加载完成后,重新生成被广告拦截器拦截而渲染失败的静态元素,将静态元素转换成动态元素.如广告图片的资源请求被拦截,导致广告图片展示失败,在遍历页面时使用JavaScript重新生成,在重新生成时的资源地址赋值操作则和动态元素的随机化一致.
5 实验与分析
广告反屏蔽系统在百度云加速部门搭建,百度云加速负责百度CDN管理,代理百度联盟的广告流量.在百度CDN处反向代理广告网站,对返回的广告内容进行处理,在页面中插入反屏蔽脚本.页面在前端加载时,发送加密的资源请求到中间件处,中间件对加密请求解密还原,发送到百度联盟.最后将百度联盟返回的资源发送到前端,由前端渲染展示广告内容.当资源请求被广告拦截器拦截或者广告内容被广告拦截器隐藏时,会导致广告展示失败.
在百度CDN上线广告反屏蔽功能前,需要对百度联盟的不同广告模板和广告内容进行测试.正常情况下,访问网站时只有使用广告拦截器的用户才会导致广告请求或显示失败,当中间件检测到第一次广告资源请求时,证明测试广告成功从浏览器端发出.测试广告展示效果时,在注入的JavaScript脚本中添加监控脚本,当广告成功展示后,会向中间件广告展示发出成功的信号.
搭建广告反屏蔽系统后,进行了以下三项测试,分别为广告请求成功比例、广告展示成功比例和上线三天对比测试.广告请求和广告展示测试为上线前测试,分别为CDN上开启和关闭反屏蔽10分钟获得的测试结果,广告测试总量在相同时间间隔内的投放量相近,可通过成功率进行对比.广告测试总数为测试广告的页面访问量,广告请求成功为CDN端收到从客户端成功发出广告请求,广告展示成功为投放的广告成功在客户端展示并通知CDN计数.首先是测试广告反屏蔽方案对浏览器发出广告请求的效果,结果如表1所示.在未开启反屏蔽功能时,投放的1438个广告测试样例,在中间件处只收到了1209个广告请求;而开启反屏蔽功能时,投放的1495个广告测试样例,在中间件处收到了1484个广告请求.测试广告的请求成功率从84.08%提升至99.26%,如图6 所示,开启广告反屏蔽功能对广告成功发出请求的提升效果十分显著.然后测试广告反屏蔽方案对广告展示的效果,结果如表2所示.在未开启反屏蔽功能时,投放的2967个广告测试样例,只有2336个广告展示成功;在开启反屏蔽功能时,投放的2816个广告测试样例,中间件处收到了2664个广告展示成功的信号;测试广告的展示成功率从78.73%提升至94.60%,如图7所示,开启广告反屏蔽功能后广告的展示成功率大幅度提升.虽然使用反广告屏蔽后的展示成功率有明显提升,但还是有5.4%的失败率,这是因为广告拦截器对广告内容的隐藏方式复杂多样,对元素属性名的修改不足以应对广告拦截器的所有检测方法.最后进行实际上线测试,表3为分别上线三天抽取10%的对比结果.广告请求量的提升为16.25%,广告展示量的提升为11.53%,结果表明启用广告反屏蔽方案对广告请求和成功展示有着明显的提升.根据2017年百度联盟分成160亿收入初略估计,使用广告反屏蔽方案能提升将近25亿广告收益.
图6 广告请求对比测试 图7 广告展示对比测试
表1 广告请求对比测试
Table 1 Ad request contrast test
反屏蔽状态广告请求成功数广告测试总数关闭12091438开启14841495
表2 广告展示对比测试
Table 2 Ad display contrast test
反屏蔽状态广告展示成功数广告测试总数关闭23362967开启26642816
表3 上线三天对比测试(10%流量)
Table 3 On-line three-day comparison test (10% flow)
反屏蔽状态广告请求量广告展示量关闭477265143602开启554830158769提升比例16.25%11.53%
6 总 结
广告是互联网收入的重要支柱,广告拦截器的介入打乱了原有的用户与网站之间的商业模式.广告拦截器的使用用户的持续增加,让网站采用反广告拦截的比例也快速增长.据2018年的检测结果表明,超过30%的用户使用了广告拦截器来清除网站投放的广告.这让依赖广告收入的互联网产业损失惨重,所以广告供应商也亟需寻求一种有效的反广告拦截技术.广告行业模板复杂,种类多样,要从广告服务器端直接进行改革则代价庞大,难以实施.
本文开发了一个不需要广告服务器介入的通用广告反屏蔽系统,可以通过浏览器端和中间件的配合完成对抗广告拦截器.本系统相较于使用WebSocket的方式绕过广告拦截器的检查更为有效,当广告拦截器增加了对WebSocket的检测后适用WebSocket的方法就失效.而本系统是针对广告拦截器的原理,对资源请求进行加密,对广告元素属性进行随机来对抗广告拦截器对广告资源的识别.WebRanz系统采用的方法的核心思想与本系统一致,不过WebRanz系统部署在服务器端,需要对服务器端的代码做大幅度修改.本系统部署在中间件,可灵活的应用于各种广告模板,兼容性更好.
广告反屏蔽系统目前应用于百度联盟广告反屏蔽业务,对比测试广告请求和广告展示的结果表明广告反屏蔽系统应用于目前的广告拦截效果显著.实际的上线三天的对比测试结果表明反屏蔽系统给百度联盟的广告展示成功率带来了大幅度提升,给公司的广告业务带来了巨大的收益提升.由于反广告屏蔽系统应用于中间件系统,适用于当前绝大部分网站结构,可方便进行大规模拓展部署,具有良好的发展前景.