首页 > 解决方案 > 发出不带正斜杠的 HTTP 请求

问题描述

我在 Apache 访问日志中遇到了一个奇怪的 HTTP 请求:

“获取www.example.com HTTP/1.0”

使用浏览器(Waterfox、Firefox 或 Chrome,(按此顺序))或 PuTTY/cURL|Terminal 如何重现此 HTTP 请求?最好是localhost因为我可以实时查看日志。

我做了一些阅读,显然cURL 只能发出绝对 URL 请求。我也无法通过 Waterfox 的网络面板中的编辑和重新发送来重现这一点。这个请求触发了一些我希望在我的系统中修复的小错误。

标签: apachehttpurlcurl

解决方案


在终端中,执行任何请求都非常容易。

你可以

  • 在端口 80 上使用 telnet telnet 127.0.0.1 80。然后你必须写请求(你可能需要快速输入,服务器可能会拒绝你因为错误的结尾行\n而不是\r\n)
  • 要绕过 telnet 限制,您可以先用简单的方式编写请求printf
# regular HTTP query
printf 'GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n'
# or the 'absolute url' mode
printf 'GET www.example.com HTTP/1.0\r\n\r\n'
# or even the official absolute uri mode, I think that's the correct one
printf 'GET http://www.example.com/ HTTP/1.0\r\n\r\n'

但是printf和 是一样的echo,有特殊的字符处理(比如\r\n)。因此,您必须复制结果并将其粘贴到 telnet。

我更喜欢使用netcat(有时称为nc)来管理 tcp/ip 套接字连接而不是 telnet,并使用管道将 printf 结果直接放入 tcp/ip 套接字(如果需要 https,则必须使用 openssl_client 而不是 netcat) . 那是:

printf 'GET www.example.com HTTP/1.0\r\n\r\n' | nc -q 3 127.0.0.1 80
# or
printf 'GET http://www.example.com/ HTTP/1.0\r\n\r\n' | nc -q 3 127.0.0.1 80

就是这样,您拥有了低技术浏览器。具有能够编写任何类型的错误查询的优势。用于代替第一个标头中位置的绝对 url 是 RFC 中的内容,以处理与非常旧的 HTTP 0.9 的兼容性:

# HTTP 0.9
printf 'GET www.example.com/foo/bar \r\n' | nc -q 3 127.0.0.1 80

在此请求中,要使用的正确 VirtualHost 是来自该位置的 VirtualHost,而不是来自 Host 标头:

# regular HTTP query
printf 'GET http://www.vhost2.com/foo HTTP/1.0\r\nHost: www.vhost1.com\r\n\r\n' |\
  nc -q 3 127.0.0.1 80

这是2013 年 James Kettle 的 Host 头攻击的基础。所以我建议你有效地跟踪小事件并修复它们。学习如何在您的服务器中注入任何特殊的 url 总是很好的。

您也可以使用 curl 发送精心制作的请求,但根据定义,真正的浏览器和命令行浏览器往往会避免发送精心制作的请求。

当您处理大量此类服务时,跟踪来自终端的 HTTP 服务器的真实响应在跟踪哪个服务器或代理损坏时也非常有效。学习如何在没有 curl 的情况下在 tcp 套接字中交谈 HTTP,这很有用。


推荐阅读