Golang hijack 劫持
简介Hijack
type Hijacker interface {// Hijack lets the caller take over the connection.// After a call to Hijack the HTTP server library// will not do anything else with the connection.//// It becomes the caller's responsibility to manage// and close the connection.//// The returned net.Conn may have read or write deadlines// already set, depending on the configuration of the// Server. It is the caller's responsibility to set// or clear those deadlines as needed.//// The returned bufio.Reader may contain unprocessed buffered// data from the client.//// After a call to Hijack, the original Request.Body must// not be used.Hijack() (net.Conn, *bufio.ReadWriter, error)
}
Hijack()
可以将HTTP对应的TCP连接取出,连接在Hijack()
之后,HTTP的相关操作就会受到影响,调用方需要负责去关闭连接。看一个简单的例子。
func handle1(w http.ResponseWriter, r *http.Request) {hj, _ := w.(http.Hijacker)conn, buf, _ := hj.Hijack()defer conn.Close()buf.WriteString("hello world")buf.Flush()
}func handle2(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "hello world")
}
问题来了,上面两个handle
方法有什么区别呢?很简单,同样是http请求,返回的结果一个遵循http协议,一个不遵循。
➜ ~ curl -i http://localhost/handle1
hello world% ➜ ~ curl -i http://localhost/handle2
HTTP/1.1 200 OK
Date: Thu, 14 Jun 2022 09:51:31 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8hello world%
分别是以上两者的返回,可以看到,hijack之后的返回,虽然body是相同的,但是完全没有遵循http协议。(废话,别人都说了hijack之后返回了body然后直接关闭了,哪来的headers = = )
但我们还是要看看为啥..
func (c *conn) serve(ctx context.Context) {...serverHandler{c.server}.ServeHTTP(w, w.req)w.cancelCtx()if c.hijacked() {return}w.finishRequest()...
}
这是net/http包中的方法,也是http路由的核心方法。调用ServeHTTP
(也就是上边的handle方法)方法,如果被hijack
了就直接return了,而一般的http请求会经过后边的finishRequest
方法,加入headers等并关闭连接。
打开方式
上边我们说了Hijack
方法,一般在在创建连接阶段使用HTTP连接,后续自己完全处理connection。符合这样的使用场景的并不多,基于HTTP协议的rpc算一个,从HTTP升级到WebSocket也算一个。
引用:golang hijack打开方式 - 简书
Golang hijack 劫持相关推荐
- golang的hijack篡取劫持
一直不太明白golang的hijack是干什么的?只知道hijack这个词是篡取的意思,难道跟网关的作用一样,把client的请求发到这个服务上,然后这个服务帮忙转发到远端server,但是看了源码后 ...
- golang Java_goLang
Golang标准库文档 https://studygolang.com/pkgdoc go语言介绍 http://www.topgoer.com/ 一文带你了解Go的工程管理 go.mod入门 go语 ...
- CSRF的绕过与利用
Origin & Referer Bypass Null值绕过 当遇到一个cors可用null值绕过时,用iframe配合data协议,就可以发送一个origin为null的请求.这个绕过方式 ...
- 宜信PaaS平台基于Calico的容器
容器云面临的网络挑战 在传统的IDC的架构里面网络是很重要的事情,在虚拟机环境中网络的发展已经有很多成熟的解决方案,现在为什么还在研究新的方案呢?因为云计算.云计算在2013.2014年之前的时间段, ...
- 恋恋有词 - 高频版
名字重音在前.动词重音在后 1-1.初始词汇 小词可以做形容词.动词.名词(小词为个数小于等于7) law 法律.规律 claw 爪.钳.用爪抓 lawful 合法的.法律许可的 lawsuit 诉讼 ...
- cs224w(图机器学习)2021冬季课程学习笔记20 Advanced Topics on GNNs
诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Advanced Topics on GNNs 2. Limitations of Grap ...
- 恋练有词重点单词快速识记
恋练有词考研重点单词快速识记 可能整个格式非常的糟糕,但这是我会一直更新的一个博文,因为我在背单词的时候,基本都会把我不会的词,打录下来,所以,这些是我认为比较重点的单词.共勉!用一个寒假的时间把整个 ...
- 2022.10.27 英语背诵
culminate 使达高潮,结束 ~ in 达到顶点 legend 传说,传奇 origin 起源,血统 technique 技术,技能,行家手法 occurrence 发生,出现 liquor 酒 ...
- 2022.10.11 英语背诵
constant 不变的,经常的,坚定的 culminate 使达高潮,使结束 ~ in liquor 酒类 nil 无,零 overture 倡议,建议,序曲 hijack 劫持,抢劫 the a ...
- 英语易混淆词语:四六级,考研均适用(持续更新中~)
1.preside:主持 reside:居住 2.withstand:承受 withdraw:撤回 3.review:评论家 interview:采访 4.subst ...
最新文章
- mysql商品管理系统总结_Mysql管理总结
- 2020年6月18日 618感言
- 【业务建模_2】通用数据工具
- Java中Json和List转换
- ORA-12154/ORA-12560 可以尝试的解决办法
- VTK:图片之DrawShapes
- c语言类型名占字节,C语言实现 数据类型占多少字节指针占多少字节
- Cassandra1.2文档学习(7)—— 规划集群部署
- python并行计算numpy_【Nature文章摘录】NumPy: 从单机到分布式并行计算
- java串口监听超时_从串口读取时如何实现read()的超时(C / C)
- php for 脚本,php for循环脚本。
- 农村包围城市:企业网站关键词排名上首页
- 什么是自适应学习(个性化学习)?
- 时间日期插件引用使用方法
- 人口流向数据_2017中国流动人口发展报告(数据摘要)
- MITxPro平台 Base SPOC-MachineLearning, Modeling, and Simulation Principles 课后习题参考答案
- 资深数据科学家教你如何在求职过程中找到心仪工作
- Python二级--奖学金评选
- solidity 异常处理
- linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列
热门文章
- privilege权限级别的命令介绍及实例分析
- PDF文件格式的特点
- 常用 25/26 Flash 系列器件型号、ID、容量对照表
- 计算机itunes无法安装,Win7电脑无法安装itunes怎么办 win7安装itunes失败的解决方法...
- xp系统itunes无法连接服务器失败,xp系统iTunes无法连接到iTunes store的修复步骤
- photoshop cs6用户界面字体太小的解决方案
- Linux,DNS服务器配置
- html 播放微信amr音频文件,微信amr文件打开的方法
- 笔记本双显卡Ubantu16.04 Nvidia驱动安装指导
- 【云原生】Helm 常用命令(chart 安装、升级、回滚、卸载等操作)