使用 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/admin 或 http://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 上观看解释视频。