使用 Symfony HttpClient,防御式编程可以非常容易

发布: (2026年3月1日 GMT+8 02:37)
2 分钟阅读
原文: Dev.to

Source: Dev.to

Problem

如果你的应用允许用户提交 URL,然后你去抓取这些 URL(用于链接预览、Webhook 或 RSS 源),就会出现严重的安全问题。攻击者可以提交类似 http://127.0.0.1/adminhttp://169.254.169.254(AWS 元数据端点)的地址,而你的服务器会毫不犹豫地去请求它们。这是一种 服务器端请求伪造(SSRF) 攻击。

Solution

Symfony 提供了内置解决方案:NoPrivateNetworkHttpClient。它装饰(decorate)你现有的 HTTP 客户端,阻止对私有 IP 段(或你自行配置的任何 IP 段)的请求。

Before

getPayload()
            ->getString('url');

        $response = $this->client
            ->request('GET', $url);

        return new JsonResponse(
            $response->getContent()
        );
    }
}

After

safeClient = new NoPrivateNetworkHttpClient($client);
    }

    #[Route('/api/preview', methods: ['POST'])]
    public function preview(
        Request $request,
    ): JsonResponse {
        $url = $request->getPayload()
            ->getString('url');

        $response = $this->safeClient
            ->request('GET', $url);

        return new JsonResponse(
            $response->getContent()
        );
    }
}

NoPrivateNetworkHttpClient 是一个装饰器,所以你只需要把它包装在已有的客户端外层——不需要其他代码改动。请查阅 Symfony 文档,以配置你想要禁止的具体 IP 或 IP 段。

如果你在抓取用户提交的 URL 时没有使用这个装饰器,应该立即开始使用。

在 YouTube 上观看解释视频。

0 浏览
Back to Blog

相关文章

阅读更多 »

国家代码与地区差异

在 Symfony Intl 中支持科索沃:Symfony 的 Intl 组件不包括科索沃,因为其 ISO 3166‑1 代码 XK 是用户分配的代码,而非官方的…