绕过运营商HTTP劫持
web 其他 2018-03-28 2976 0
关于本站

“最难不过坚持”

本人承接扒站仿站,php网站维护,病毒查杀,网站编辑,网站改版,html制作

有需要网站维护,改版,病毒查杀,网站编辑,网站备案,html制作等相关的工作可以联系我。
本人有多年相关工作经验,也可提供免费咨询,交个朋友。
有需要探讨问题的朋友,也可以加我微信,共同探讨!
微信:15011482830 QQ:408917339

6282577 2594 39
最新评论
https://jueru.net/
评 留言
:weixiao:
评 留言
:shuijiao: :weiqu: :zhenbang: :leng:
评 留言
:yiwen: :yiwen: :yiwen: :yiwen:
评 EasySass: could not generate CSS file. See Output panel for details.
这个业务逻辑多少都有点奇怪了,阅读浏览次数增值在新闻详情页的控制器方法里setInc,这怎么还写进模型事件里了。如果非要用onAfterRead也可以,把新闻文章的内容单独分出来一个news_content表,然后把它和news做关联,然后给news_content表的onAfterRead事件做增值处理,这样点进新闻页内查询到文章内容时才会触发它。
评 TP6模型事件-查询后onAfterRead不好用
文章标签更多
ThinkPHP (254)
Mysql (58)
DedeCms (33)
jQuery (67)
证件照 (1)
setInc (4)
setDec (4)
onclick (5)
打开边栏(ESC) 关闭边栏(ESC)

中国的网络是奇葩的,原因之一是有奇葩的屌丝运营商。

许多小运营商(二级运营商、三级运营商、N级运营商)为了节省成本,会使用缓存系统。 这个缓存系统可以认为是一种CDN,如果做得好的话,不仅会节省成本,也会提高用户体验, 例如许多小区里大家看优酷视频从来不会缓冲,下载速度都有3MB/s以上的速度。 然而,这些缓存系统并不是CDN,而是一种非常没有节操的黑盒子。

  • 你不知道什么请求会被缓存,没法控制。
  • 你不知道会被缓存多久。
  • 这种缓存不遵守任何行业内的规则(例如不遵守Cache-Control头)。
  • 发现缓存了错误的内容,你没有地方投诉。

许多用户和开发者都为此非常头疼。例如:

  • 我去年入手iPad后,尝试在电脑上安装iTunes,从官网下载安装后,提示版本太旧,不支持新iPad,于是 自动更新,更新非常快,但更新之后仍然提示版本太旧,仔细观察发现版本并没有变。后来发现是运营商 缓存了一份老的,而苹果分发iTunes时是同名更新的。
  • 许多网页游戏(主要是flash)的开发者都非常的头疼,flash资源的加载成功率能到90%以上就算非常不错了。 为此我们也想了各种dirty的方法,例如将后缀都改成.aspx?rnd-query-string,以期望绕过运营商缓存。

其劫持的手段也是非常的无节操的,主要受益于郭嘉的某墙开发的成果。其劫持原理大致如下:

  • 客户端C向服务器S发出一个HTTP请求;
  • 运营商网关将该请求分光(复制)送到缓存服务器;
  • 缓存服务器如果发现命中缓存,则伪装成S返回一个302响应,该响应通常比S的正确响应早到,因此C接受 了该响应,而忽略了S的响应,从而跳转到缓存服务器取数据;

是的,这正是伟大的墙发送RST的方法。

我们看一个例子,正常的请求应该是这样的:

$ curl -I http://mirrors.ustc.edu.cn/ubuntu/dists/lucid-updates/main/binary-amd64/Packages.bz2
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Thu, 19 Dec 2013 09:54:42 GMT
Content-Type: text/plain
Content-Length: 724863
Last-Modified: Thu, 19 Dec 2013 09:02:00 GMT
Connection: keep-alive
Accept-Ranges: bytes

被劫持的请求是这样的:

$ curl -I http://mirrors.ustc.edu.cn/ubuntu/dists/lucid-updates/main/binary-amd64/Packages.bz2
HTTP/1.1 302 Found
Connection: close
Location: http://59.108.200.39/files/512100000196E4FC/us.archive.ubuntu.com/ubuntu/dists/lucid-updates/main/binary-amd64/Packages.bz2

通常缓存服务器的IP是有限的,因此我们可以这样绕过运营商的劫持,在网关(或自己机器上)添加一条iptables规则:

iptables -A FORWARD -p tcp --sport 80 -m string --string "Location: http://59.108.200.39" --algo bm -j DROP

该规则的意义是,如果某个HTTP响应包(这里并没有真正判断是否HTTP,仅分析来自80端口的包)中含有 Location: http://59.108.200.39 字样,就直接丢弃。这样后续S真实的响应包就能被客户端接收,从而保证正确的通信。

注意,如果是在自己的机器上,则将FORWARD替换成INPUT

这里我们要感谢该运营商没有像某墙那样的没节操,某墙在向C发送RST的同时,也向S发送了RST,而该缓存服务器并没有 向S发送RST,彻底破坏tcp通信。

版权声明:本篇文章来源于网络。 来源链接

相关推荐
Uncaught (in promise) 的解决方法,可能原因
其他 | 2022-06-25 1076979
Uncaught (in promise) 的解决方法,可能原因;仅仅只是一种参考原因 我是因为copy的项目直接修改的,结果一直报错 Uncaught (in promise),检查发现接口请求数据已经正常返回,后来经过排查发现是在拦截器里面别人的判断是response.data.status !== 1 就算请求失败,从而Promi...
钉钉怎样设置快捷键?钉钉系统设置在哪
其他 | 2019-03-20 20939
钉钉怎样设置快捷键? 1,打开电脑端钉钉面板,点击右上角自己的头像,下拉菜单中点击系统设置 2,进入系统设置面板,下拉滚动条,找到快捷键设置
评论:0条
评论加载中...
发表评论