我的服务器依靠IP过滤来保证安全.我想知道是否有人可以绕过保护,依赖于远程IP过滤使用net.SplitHostPort(r.RemoteAddr)

为此,我创建了这个虚拟的HTTP服务器:

package main

import (
    "fmt"
    "net"
    "net/http"
)

func getHello(w http.ResponseWriter, r *http.Request) {
    fmt.Printf("got /hello request\n")
    host, _, _ := net.SplitHostPort(r.RemoteAddr)
    fmt.Printf("Ip is %s\n", host)
}

func main() {
    http.HandleFunc("/hello", getHello)

    http.ListenAndServe(":3333", nil)
}

然后我用Curl做了一些测试:

curl http://localhost:3333/hello 
<- Logs in my server -> Ip is 127.0.0.1

curl http://localhost:3333/hello -H "X-Forwarded-For: 3.3.3.3" -H "Host: 3.3.3.3"
<- Logs in my server -> Ip is 127.0.0.1

这似乎是安全的,因为我无法欺骗我的服务器认为请求的IP是3.3.3.3.

r.RemoteAddr是否真的安全并查找TCP数据包内部的IP?或者,有没有办法通过使用报头或伪造数据包来绕过它?

推荐答案

根据DOChere

HTTP客户端忽略RemoteAddr字段.

它只能由HTTP服务器通过读取IP包中的Source Address来设置.

Host&;X-Forwarded-For是仅在TCP握手后传递的http报头.因此,您的HTTP服务器在成功握手后在报头中传递此类信息之前已经获得了RemoteAddr.

Go相关问答推荐

从Kafka到Clickhouse的实时消费数据

如何复制*C.char?

使用一元或服务器流将切片从GRPC服务器返回到客户端

mockgen不创建模拟

错误&对象已被Golang在K8s操作符上修改

Golang Gorm Fiber / argon2.Config 未定义

如何将 goose 迁移与 pgx 一起使用?

Kusto Go API 从多个表查询

Golang text/template中的startswith函数 - 入门教程

是否可以在 hyperledger-chaincode 中使用 gRPC?如果可以,我如何避免在测试网络上调用时出错?

泛型:实现嵌套接口

为什么不同的 Wireguard 私钥会产生相同的公钥?

使用自定义处理程序 nats golang 保留订阅方法

如何根据 Go 中第二次出现的分隔符拆分字符串?

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

如何从 Go 1.18 中的单个方法返回两种不同的具体类型?

Grafana/Prometheus 将多个 ip 可视化为查询

是否可以使用按位运算在随机 unicode 字符串中找到重复字符?

使用 xml.Name 将 xml 解组为 [] struct

我应该明确地创建一个与Belongs To或Has Many对称的关系吗?