Sifter.FullText.Sanitizers.Strict (Sifter v0.2.0)

View Source

Strict sanitizer for raw tsquery operations with defense-in-depth security.

This sanitizer implements aggressive filtering providing multiple layers of protection against OWASP SQL wildcard attacks and PostgreSQL tsquery injection vulnerabilities.

Security Features

  • Input length limitations to prevent DoS attacks
  • Aggressive character filtering to remove wildcards and special characters
  • Term count limitations to prevent query complexity attacks
  • Minimum term length requirements to prevent wildcard-like behavior
  • Only allows alphanumeric characters
  • Automatically appends prefix matching (:*) to valid terms

Usage

iex> Sifter.FullText.Sanitizers.Strict.sanitize_tsquery("validation system")
"validation:* & system:*"

iex> Sifter.FullText.Sanitizers.Strict.sanitize_tsquery("'; DROP TABLE --")
""

iex> Sifter.FullText.Sanitizers.Strict.sanitize_tsquery("a")
""

iex> Sifter.FullText.Sanitizers.Strict.sanitize_tsquery("test123 data-mining")
"test123:* & datamining:*"

Summary

Functions

Sanitizes a search term for safe use with raw tsquery operations.

Validates if a sanitized search query is safe and non-empty.

Functions

sanitize_tsquery(term)

@spec sanitize_tsquery(term :: any()) :: String.t()

Sanitizes a search term for safe use with raw tsquery operations.

This function implements defense-in-depth security measures including:

  • Limits total query length to 100 characters
  • Limits to maximum 10 search terms
  • Removes all special characters including wildcards (%, _, ., -, etc.)
  • Requires minimum 2 character term length
  • Limits final processed terms to 5
  • Only allows alphanumeric characters
  • Joins terms with ' & ' for AND logic
  • Appends ':*' for prefix matching

Parameters

  • term - The search term to sanitize (binary or other)

Returns

A sanitized tsquery string ready for use with PostgreSQL's to_tsquery() function, or empty string for invalid/unsafe input.

valid_search_query?(sanitized_query)

@spec valid_search_query?(any()) :: boolean()

Validates if a sanitized search query is safe and non-empty.

Parameters

  • sanitized_query - The query string to validate

Returns

true if the query is safe and non-empty, false otherwise.