先聊一个有意思的现象:HTML5在淘汰了一批老掉牙的标签(比如、)的同时,也带来了不少新鲜玩意儿——比如和,它们让页面能动态加载音视频,体验感确实上了一个台阶。
但新东西往往也藏着新风险。像、、、、这些标签,它们身上的某些属性(比如poster、autofocus、onerror、formaction、oninput)看起来挺酷,却可以直接用来执行Ja vaScript。这意味着什么?XSS和CSRF这类跨域攻击,又多了几条新路。
下面要说的,就是这些关键“载体”——它们能催生出各种XSS变种,而且经常能绕过现成的过滤器。先看一个典型例子:

注意这里用了标签,却没有指定具体的src,所以后面的onerror方法会立刻触发执行。触发即攻击,就这么直接。
再看标签的poster属性——它本意是指向一张图片,当作视频未响应或缓冲不足时的占位符。但攻击者完全可以把poster的值设成ja vascript:alert(1),让浏览器在加载这个“占位符”时直接执行脚本。
除此之外,autofocus和formaction这两个属性也是“内鬼”。autofocus让元素自动获得焦点,而formaction可以覆盖form元素的action属性——攻击者通过精心构造的输入,就能把表单提交的目标改成恶意地址。

实际场景中,很多系统虽然已经对旧标签和属性做了过滤、清洗,但只要有一个地方允许用户输入,这些新标签就有了可乘之机。举个例子:攻击者输入https://www.yujie.com/1.php?text=,脚本立刻就能跑起来。这哪是占位符,分明是“占位冲击波”。

应对这类攻击的思路其实很明确:把前端或后端的过滤器升级一下,把那些“高危”标签和属性加进黑名单,或者更严格地限制输入内容的格式。没有银弹,但至少能做到“发现一个,堵死一个”。
以上就是关于新标签攻击的核心内容。把这些细节吃透,才能真正做到防御在前、安全在线。
