多级路由重复劫持页面导致插入多个相同 js 的问题

路由器劫持

路由器通过劫持 http 响应包并 注入JS ,进而播放广告。
如果路由器直接上网是没有问题的。后来把路由器(假设为路由器A)的上网模式改成了无线中继,让路由器 A 通过路由器 B 间接上网(路由器 A 和 B 都有相同的劫持功能),此时返回的 http 页面就会有两条相同的 JS。原因很明显,路由器 A 和路由器 B 对同一个 http 响应先后注入了 JS。这样的话,就会执行两个相同的 JS。那么应该如何避免这种情况呢?

方案一:路由器级别实现

一种方案是,让这些被中继的路由器(非客户端直连的路由,上级路由),不要注入 JS。上级路由是可以知道哪些下级路由中继了它,以及分配给它们的 ip 地址,还有它们的 mac 地址。那么当一个 http 响应返回时,上级路由可以根据响应包的目标地址判断这个响应包是要转发给用户终端还是下级路由。如果是要转发给下级路由,则不用注入jS。

方案二:在业务层实现

路由器不做任何处理,在 JS 以及与 JS 交互的服务器实现。由于路由器注入 JS 时也会把请求连接的设备 mac 一并注入,那么就可以在 JS 或者服务器判断这个设备 mac 究竟是手机的 mac,还是下级路由器的 mac(路由器的 mac 会有特定的标识)。如果是下级路由器的 mac,那么就退出执行这个 JS。