diff options
| author | Fuwn <[email protected]> | 2026-02-08 09:23:43 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-08 09:23:43 -0800 |
| commit | 56cbd35136a5a7b366835bf6c662ed068f6b5dec (patch) | |
| tree | 1a6dc83f997683341ed3476d8f38690bfe7b7114 /services/worker/internal/writer | |
| parent | security: sanitize HTML in marketing demo (diff) | |
| download | asa.news-56cbd35136a5a7b366835bf6c662ed068f6b5dec.tar.xz asa.news-56cbd35136a5a7b366835bf6c662ed068f6b5dec.zip | |
security: harden Go worker
- Fix SSRF TOCTOU: add custom dialer that resolves DNS and validates
IPs at connection time, preventing DNS rebinding attacks
- Handle IPv4-mapped IPv6 addresses (::ffff:127.0.0.1) in SSRF
protection by normalizing to IPv4 before checking reserved ranges
- Sanitize feed error messages before storing: strip credentials
from URLs and truncate to 500 chars
- Remove unused EncryptionKey from configuration
- Add stack trace logging to worker panic recovery for debugging
- Run go fmt
Diffstat (limited to 'services/worker/internal/writer')
| -rw-r--r-- | services/worker/internal/writer/writer.go | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/services/worker/internal/writer/writer.go b/services/worker/internal/writer/writer.go index 748deb0..fb413e0 100644 --- a/services/worker/internal/writer/writer.go +++ b/services/worker/internal/writer/writer.go @@ -3,10 +3,12 @@ package writer import ( "context" "fmt" - "github.com/Fuwn/asa-news/internal/model" - "github.com/jackc/pgx/v5/pgxpool" + "net/url" "strings" "time" + + "github.com/Fuwn/asa-news/internal/model" + "github.com/jackc/pgx/v5/pgxpool" ) type Writer struct { @@ -192,11 +194,28 @@ func (feedWriter *Writer) UpdateFeedType( return nil } +func sanitizeErrorMessage(errorMessage string) string { + sanitized := errorMessage + for _, word := range strings.Fields(errorMessage) { + if parsed, parseError := url.Parse(word); parseError == nil && parsed.User != nil { + parsed.User = nil + sanitized = strings.ReplaceAll(sanitized, word, parsed.String()) + } + } + + if len(sanitized) > 500 { + sanitized = sanitized[:500] + } + + return sanitized +} + func (feedWriter *Writer) RecordFeedError( updateContext context.Context, feedIdentifier string, errorMessage string, ) error { + errorMessage = sanitizeErrorMessage(errorMessage) currentTime := time.Now().UTC() updateQuery := ` UPDATE feeds |