【问题标题】:Sending low level raw HTTP/HTTPS requests in node JS在节点 JS 中发送低级原始 HTTP/HTTPS 请求
【发布时间】:2021-04-19 19:38:40
【问题描述】:

我正在编写一个拦截代理工具,如Burpsuite 用于安全测试。其中一个重要部分是发送格式错误的 HTTP 请求,在这种情况下,我们必须让用户完全控制请求!

所以,我在使用库时无法完全控制!我需要能够向目标主机发送原始 HTTP 请求,例如,

GET / HTTP/1.1
Host: google.com

我的尝试:-

我尝试使用节点 JS net module,我能够连接到端口 80 (HTTP) 上的主机,同时连接到端口 443 (HTTPS ),建立连接但返回空响应!

在一些研究中,我发现这与 SSL 有关,因为我尝试了 telnet,但 HTTPS 连接也失败了,并查看了一些 stackoverflow 答案!

是否有任何选项可以让我直接从我的节点应用程序直接发送原始 HTTP/HTTPS 请求?

谢谢!

【问题讨论】:

  • 尝试对 HTTPS 请求使用 tls 模块。
  • 嘿,很抱歉延迟响应,但我有一个部分工作的代码,我无法使用 TLS 模块发出 HTTP 请求,但能够发出 HTTPs 请求!
  • 没错,实际上——net 模块是未加密的 TCP,tls 模块是加密的 TCP(即 TLS)。您必须使用这两个模块来发出 HTTP/HTTPS 请求:net 用于 HTTP,tls 用于 HTTPS。
  • 感谢您的信息! :)

标签: node.js sockets http ssl https


【解决方案1】:

有一个模块http-tag,它允许编写像 -

这样的文字 http 消息
const net = require('net')
const HTTPTag = require('http-tag')

const socket = net.createConnection({
    host: 'localhost',
    port: 8000,
}, () => {
    // This callback is run once, when socket connected

    // Instead of manually writing like this:
    // socket.write('GET / HTTP/1.1\r\n')
    // socket.write('My-Custom-Header: Header1\r\n\r\n')
    
    // You will be able to write your request(or response) like this:
    const xHeader = 'Header1' // here in the epressions you can pass any characters you want
    socket.write(
        HTTPTag`
        GET / HTTP/1.1
        My-Custom-Header: ${xHeader}
        
        `
    )
    socket.end()
})

socket.on('close', hasError => console.log(`Socket Closed, hasError: ${hasError}`))

// set readable stream encoding
socket.setEncoding('utf-8')
socket.on('data', data => console.log(data))

关于TLS,目前我正在研究内置节点模块,还没有查看tls。

【讨论】:

  • 嘿!但我的要求是将原始请求发送到远程服务器,但我无法从库中确定如何做到这一点。我想如果你能详细说明你使用过的socket 对象,我会得到更多的理解:)
  • 我的回答与发送格式错误的 http 请求的一部分有关,当您想要控制您发送的内容时,最终,无论您使用什么传输层协议 - TCP 或 TCP 上的 TLS,如果你还没有这样的东西,你将需要这个。我将编辑答案以提供有关如何打开套接字和发送请求的信息,您可以在 express 服务器上进行测试。
  • 哇,这是一个很好的解决方案✨!我目前能够发送 HTTP 请求并接收他们的响应,我想知道是否有类似的方式来发出 HTTPS 请求?我尝试使用 TLS 模块,但连接到 google.com 时出现自签名证书错误。这是代码pastebin.com/TKgARX9V!有什么想法吗? :)
  • 我目前在选项中设置了servername: 'google.com',它可以工作,你可以在文档中找到它 - tls.connect 如果我没有误解背后的想法,那就是,有时有多个主机名在相同的服务器,因此此选项指定您的客户端期望的主机证书。同样写在文档中 - Server Name Indication
  • 好吧,尽管如此,我误解了servername 选项 :) 这是来自文档的注释 - 它可以被多宿主服务器用来选择正确的证书来呈现到客户端,它由服务器使用,而不是由客户端使用:)
猜你喜欢
  • 2016-02-11
  • 2016-06-29
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2016-12-12
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多