방어적 프로그래밍은 Symfony HttpClient와 함께 매우 쉽게 할 수 있습니다
Source: Dev.to
Problem
앱에서 사용자가 URL을 제출하고 이를 가져와서(링크 미리보기, 웹훅, RSS 피드 등) 처리한다면, 심각한 보안 문제가 발생할 수 있습니다. 공격자는 http://127.0.0.1/admin 혹은 http://169.254.169.254(AWS 메타데이터 엔드포인트)와 같은 URL을 제출할 수 있으며, 서버는 이를 그대로 요청하게 됩니다. 이는 Server‑Side Request Forgery (SSRF) 공격입니다.
Solution
Symfony는 내장 솔루션을 제공합니다: NoPrivateNetworkHttpClient. 기존 HTTP 클라이언트를 데코레이터 형태로 감싸며, 사설 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는 데코레이터이므로 기존 클라이언트를 간단히 감싸기만 하면 됩니다—다른 코드 변경은 필요하지 않습니다. 차단하고 싶은 특정 IP 또는 IP 대역을 설정하려면 Symfony 문서를 참고하세요.
사용자가 제출한 URL을 가져오면서 이 데코레이터를 사용하지 않았다면, 지금 바로 적용하시기 바랍니다.
YouTube에서 설명을 시청하세요.