- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试在没有现有 Web 服务器的情况下用 C 创建一个简单的 Git HTTP 服务器。目前我唯一做的就是创建一个服务器套接字并使用客户端请求中的环境变量执行 git-http-backend CGI 脚本。 Pull 请求已经可以工作,但仅适用于空存储库。当我尝试克隆包含内容的存储库时,我在客户端收到此错误:
fatal: protocol error: bad line length character:
这是客户端和服务器之间的通信日志:
C: GET /test.git/info/refs?service=git-upload-pack HTTP/1.1
C: Host: localhost:9000
C: User-Agent: git/2.20.1
C: Accept: */*
C: Accept-Encoding: deflate, gzip
C: Accept-Language: en-US, *;q=0.9
C: Pragma: no-cache
C:
S: HTTP/1.1 200 OK
S: Expires: Fri, 01 Jan 1980 00:00:00 GMT
S: Pragma: no-cache
S: Cache-Control: no-cache, max-age=0, must-revalidate
S: Content-Type: application/x-git-upload-pack-advertisement
S:
S: 001e# service=git-upload-pack
S: 000000fadd3fba560f4afe000e70464ac3a7a9991ad13eb0
S: HEAD003fdd3fba560f4afe000e70464ac3a7a9991ad13eb0 refs/heads/master
S: 0000
请注意一点:HTTP/1.1 200 OK 是手动添加的,其余部分来自 CGI 脚本。您还可以找到我的代码 here 。 首先,我有这样的理论:服务器响应的内容错误地放置了新行(例如,HEAD 应该高出一行),但事实证明事实并非如此。所以我的问题是:我能做些什么吗?在 C 中将此响应编辑为良好的格式相当复杂,尤其是响应较长的情况。
最佳答案
首先,请确保您了解将外部参与者控制的数据传递给 popen
等函数的安全隐患。您现在拥有的实现可以通过向请求行添加 shell 特殊字符来通过 shell 注入(inject)轻松利用。即使仅使用 git 和特制的存储库名称,您当前的代码也允许在服务器上执行任意命令。例如尝试这个:
git clone "$(echo -e 'http://localhost:9000/;echo\tunexpected\t>helloworld;cat\t/etc/passwd;exit;.git')"
这将在服务器的工作目录中创建一个文件,其中包含字符串“unexpected”,并将/etc/passwd
的内容发送回客户端(使用wireshark查看它)。
为了避免这种情况,您需要确保正确转义输入数据,以免发生 shell 注入(inject)。理想情况下,您可以使用像 execve 这样的机制,它允许您将环境变量和可能的命令行参数作为缓冲区提交,而不是生成可能不安全的字符串,然后由 shell 进行解析。这样的解决方案当然涉及更多一些,因为它意味着重组您的程序。
那么您正在使用不安全的方式来连接字符串。 strcat
无法知道目标缓冲区有多大,因此,如果有足够的输入,它会很乐意覆盖缓冲区后面的堆栈。这是一个典型的堆栈溢出,可以被利用。使用更安全的替代方案,例如 strlcat
或更好的合适的字符串库。
现在回到你原来的问题:
从 git http-backend 获得的输出是原始二进制输出,包括空字节。在示例响应中,在分隔受支持的功能列表的 HEAD
之后确实会有一个空字节。您可以通过手动运行命令并将其通过管道传输到 xxd 之类的内容或将其转储到文件并使用十六进制编辑器查看来看到这一点。
在从管道读取数据然后将输出连接到响应缓冲区的循环中,您会截断数据,因为 strcat
对以空字节终止的 C 字符串进行操作。 HEAD
行的其余部分和空字节本身永远不会到达响应,从而破坏了 git 协议(protocol)。
您可以使用fread
将原始数据从管道直接读取到缓冲区中。然后,您需要使用一个不会在空字节处停止的函数(例如 memcpy
)将该缓冲区复制到响应缓冲区。为此,您还需要跟踪已读取的字节以及响应缓冲区中仍剩余多少空间。
或者,由于您实际上不对最终响应缓冲区进行任何处理,因此您也可以直接将从管道读取的数据发送到客户端套接字。这样您就不需要担心响应缓冲区的大小并跟踪偏移量和剩余空间。这是一个适用于 git
初始请求的版本:
char response[10000] = "HTTP/1.1 200 OK\r\n";
send(client_socket, response, strlen(response), 0);
while (!feof(g)) {
size_t bytes_read = fread(response, 1, sizeof(response), g);
if (bytes_read == 0)
break;
send(client_socket, response, bytes_read, 0);
}
随后的 POST 请求失败。
关于c - Git HTTP 错误 'fatal: protocol error: bad line length character: ',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53894901/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!