Documentation
¶
Overview ¶
Package sanitization provides centralized data sanitization utilities to prevent sensitive data exposure across the Lift framework.
Index ¶
- Variables
- func MaskCardNumber(match string) string
- func MaskCompletelyFunc(replacement string) func(string) string
- func MaskTokenLastFour(match string) string
- func SanitizeFieldValue(key string, value any) any
- func SanitizeHeaders(headers map[string][]string) map[string]string
- func SanitizeJSON(jsonBytes []byte) string
- func SanitizeMap(data map[string]any) map[string]any
- func SanitizeQueryParams(params map[string][]string) map[string]string
- func SanitizeXML(xmlString string, patterns []XMLSanitizationPattern) string
- type SanitizationType
- type Sanitizer
- func (s *Sanitizer) SanitizeFieldValue(key string, value any) any
- func (s *Sanitizer) SanitizeHeaders(headers map[string][]string) map[string]string
- func (s *Sanitizer) SanitizeMap(data map[string]any) map[string]any
- func (s *Sanitizer) SanitizeQueryParams(params map[string][]string) map[string]string
- type XMLSanitizationPattern
Constants ¶
This section is empty.
Variables ¶
var AllowedFields = map[string]bool{ "card_bin": true, "card_brand": true, "card_type": true, }
AllowedFields are field names that should bypass sanitization.
var PaymentXMLPatterns = []XMLSanitizationPattern{ { Name: "AcctNum", Pattern: regexp.MustCompile(`<AcctNum>(\d{12,19})</AcctNum>`), MaskingFunc: MaskCardNumber, }, { Name: "AcctNum_Escaped", Pattern: regexp.MustCompile(`<AcctNum>(\d{12,19})</AcctNum>`), MaskingFunc: MaskCardNumber, }, { Name: "CardExpiryDate", Pattern: regexp.MustCompile(`<CardExpiryDate>(\d+)</CardExpiryDate>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "CardExpiryDate_Escaped", Pattern: regexp.MustCompile(`<CardExpiryDate>(\d+)</CardExpiryDate>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "CCVData", Pattern: regexp.MustCompile(`<CCVData>(\d+)</CCVData>`), MaskingFunc: MaskCompletelyFunc("***"), }, { Name: "CCVData_Escaped", Pattern: regexp.MustCompile(`<CCVData>(\d+)</CCVData>`), MaskingFunc: MaskCompletelyFunc("***"), }, { Name: "CVV", Pattern: regexp.MustCompile(`<CVV>(\d+)</CVV>`), MaskingFunc: MaskCompletelyFunc("***"), }, { Name: "CVV_Escaped", Pattern: regexp.MustCompile(`<CVV>(\d+)</CVV>`), MaskingFunc: MaskCompletelyFunc("***"), }, { Name: "SecurityCode", Pattern: regexp.MustCompile(`<SecurityCode>(\d+)</SecurityCode>`), MaskingFunc: MaskCompletelyFunc("***"), }, { Name: "SecurityCode_Escaped", Pattern: regexp.MustCompile(`<SecurityCode>(\d+)</SecurityCode>`), MaskingFunc: MaskCompletelyFunc("***"), }, { Name: "TransArmorToken", Pattern: regexp.MustCompile(`<TransArmorToken>([^<]+)</TransArmorToken>`), MaskingFunc: MaskTokenLastFour, }, { Name: "TransArmorToken_Escaped", Pattern: regexp.MustCompile(`<TransArmorToken>([^<]+)</TransArmorToken>`), MaskingFunc: MaskTokenLastFour, }, { Name: "SSN", Pattern: regexp.MustCompile(`<SSN>([^<]+)</SSN>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "SSN_Escaped", Pattern: regexp.MustCompile(`<SSN>([^<]+)</SSN>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "TaxID", Pattern: regexp.MustCompile(`<TaxID>([^<]+)</TaxID>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "TaxID_Escaped", Pattern: regexp.MustCompile(`<TaxID>([^<]+)</TaxID>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "TaxId", Pattern: regexp.MustCompile(`<TaxId>([^<]+)</TaxId>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "TaxId_Escaped", Pattern: regexp.MustCompile(`<TaxId>([^<]+)</TaxId>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "PIN", Pattern: regexp.MustCompile(`<PIN>([^<]+)</PIN>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "PIN_Escaped", Pattern: regexp.MustCompile(`<PIN>([^<]+)</PIN>`), MaskingFunc: MaskCompletelyFunc("****"), }, { Name: "AccountNumber", Pattern: regexp.MustCompile(`<AccountNumber>(\d{4,17})</AccountNumber>`), MaskingFunc: MaskCardNumber, }, { Name: "AccountNumber_Escaped", Pattern: regexp.MustCompile(`<AccountNumber>(\d{4,17})</AccountNumber>`), MaskingFunc: MaskCardNumber, }, { Name: "RoutingNumber", Pattern: regexp.MustCompile(`<RoutingNumber>(\d{9})</RoutingNumber>`), MaskingFunc: MaskCardNumber, }, { Name: "RoutingNumber_Escaped", Pattern: regexp.MustCompile(`<RoutingNumber>(\d{9})</RoutingNumber>`), MaskingFunc: MaskCardNumber, }, }
PaymentXMLPatterns contains pre-configured patterns for common payment processing XML elements These patterns handle both regular XML and HTML-escaped XML for maximum compatibility
Usage:
sanitized := sanitization.SanitizeXML(xmlString, sanitization.PaymentXMLPatterns)
Patterns are applied in order, so more specific patterns should come before general ones.
var RapidConnectXMLPatterns = PaymentXMLPatterns
RapidConnectXMLPatterns is an alias for PaymentXMLPatterns for backward compatibility and explicit use with Rapid Connect (FiServ) integrations
var SensitiveFields = map[string]SanitizationType{ "cvv": FullyRedact, "security_code": FullyRedact, "cvv2": FullyRedact, "cvc": FullyRedact, "cvc2": FullyRedact, "card_number": PartialMask, "number": PartialMask, "account_number": PartialMask, "ssn": PartialMask, "tin": PartialMask, "tax_id": PartialMask, "ein": PartialMask, "password": FullyRedact, "secret": FullyRedact, "private_key": FullyRedact, "secret_key": FullyRedact, "api_token": FullyRedact, "authorization": FullyRedact, "authorization_id": FullyRedact, "authorization_header": FullyRedact, }
SensitiveFields defines fields that require explicit sanitization behavior.
Functions ¶
func MaskCardNumber ¶ added in v1.0.65
MaskCardNumber shows only last 4 digits of card numbers (PCI DSS compliant) Handles both <AcctNum>1234567890123456</AcctNum> and HTML-escaped variants
func MaskCompletelyFunc ¶ added in v1.0.65
MaskCompletelyFunc returns a function that masks a field completely with a replacement string Used for highly sensitive fields like CVV, SSN, expiry dates
func MaskTokenLastFour ¶ added in v1.0.65
MaskTokenLastFour shows only last 4 characters of tokens Used for TransArmorToken and similar processor tokens
func SanitizeFieldValue ¶
SanitizeFieldValue uses the default sanitizer
func SanitizeHeaders ¶
SanitizeHeaders uses the default sanitizer
func SanitizeJSON ¶ added in v1.0.65
SanitizeJSON recursively sanitizes JSON data for logging Returns a formatted JSON string with sensitive data masked using Lift's field sanitization
Example:
reqJSON, _ := json.Marshal(paymentRequest)
logger.Info("Processing payment", map[string]any{
"request_json": sanitization.SanitizeJSON(reqJSON),
})
Output will mask sensitive fields like card_number, cvv, ssn, etc. based on Lift's DataClassification system while preserving the JSON structure.
func SanitizeMap ¶
SanitizeMap uses the default sanitizer
func SanitizeQueryParams ¶
SanitizeQueryParams uses the default sanitizer
func SanitizeXML ¶ added in v1.0.65
func SanitizeXML(xmlString string, patterns []XMLSanitizationPattern) string
SanitizeXML sanitizes XML content using configurable patterns Supports both regular XML (<AcctNum>...</AcctNum>) and HTML-escaped XML (<AcctNum>...</AcctNum>)
Example:
xmlRequest := buildRapidConnectXML(...)
logger.Info("Sending request", map[string]any{
"xml_request": sanitization.SanitizeXML(xmlRequest, sanitization.PaymentXMLPatterns),
})
The function applies each pattern in sequence to the XML string, allowing for comprehensive masking of sensitive data.
Types ¶
type SanitizationType ¶ added in v1.0.68
type SanitizationType int
SanitizationType defines how to sanitize a field
const ( FullyRedact SanitizationType = iota // Replace with "[REDACTED]" PartialMask // Show partial data (e.g., last 4 digits) )
type Sanitizer ¶
type Sanitizer struct {
// contains filtered or unexported fields
}
Sanitizer provides methods for sanitizing various types of data
func Default ¶
func Default() *Sanitizer
Default returns a sanitizer with default data protection configuration
func New ¶
func New(dpm *security.DataProtectionManager) *Sanitizer
New creates a new Sanitizer with a data protection manager
func (*Sanitizer) SanitizeFieldValue ¶
SanitizeFieldValue sanitizes a field value based on its key name and data classification
func (*Sanitizer) SanitizeHeaders ¶
SanitizeHeaders removes sensitive headers from a map
func (*Sanitizer) SanitizeMap ¶
SanitizeMap applies sanitization to all values in a map
type XMLSanitizationPattern ¶ added in v1.0.65
type XMLSanitizationPattern struct {
Pattern *regexp.Regexp // Regex to match XML elements (both regular and HTML-escaped)
MaskingFunc func(match string) string // Function to mask the matched value
Name string // Descriptive name for the pattern (e.g., "AcctNum", "CVV")
}
XMLSanitizationPattern defines a regex-based sanitization rule for XML elements