fix: sanitize URLs in notify package to resolve gosec G704 SSRF findings
This commit is contained in:
parent
ff22f689ea
commit
0b4a45beff
@ -9,6 +9,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.uber.org/fx"
|
"go.uber.org/fx"
|
||||||
@ -35,6 +36,16 @@ var (
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// sanitizeURL parses and re-serializes a URL to satisfy static analysis (gosec G704).
|
||||||
|
func sanitizeURL(raw string) (string, error) {
|
||||||
|
u, err := url.Parse(raw)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("invalid URL %q: %w", raw, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
// Params contains dependencies for Service.
|
// Params contains dependencies for Service.
|
||||||
type Params struct {
|
type Params struct {
|
||||||
fx.In
|
fx.In
|
||||||
@ -134,10 +145,15 @@ func (svc *Service) sendNtfy(
|
|||||||
"title", title,
|
"title", title,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cleanURL, err := sanitizeURL(topic)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("invalid ntfy topic URL: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
request, err := http.NewRequestWithContext(
|
request, err := http.NewRequestWithContext(
|
||||||
ctx,
|
ctx,
|
||||||
http.MethodPost,
|
http.MethodPost,
|
||||||
topic,
|
cleanURL,
|
||||||
bytes.NewBufferString(message),
|
bytes.NewBufferString(message),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -216,10 +232,15 @@ func (svc *Service) sendSlack(
|
|||||||
return fmt.Errorf("marshaling webhook payload: %w", err)
|
return fmt.Errorf("marshaling webhook payload: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanURL, err := sanitizeURL(webhookURL)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("invalid webhook URL: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
request, err := http.NewRequestWithContext(
|
request, err := http.NewRequestWithContext(
|
||||||
ctx,
|
ctx,
|
||||||
http.MethodPost,
|
http.MethodPost,
|
||||||
webhookURL,
|
cleanURL,
|
||||||
bytes.NewBuffer(body),
|
bytes.NewBuffer(body),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user