MFE Integration

sanitizePostgrestSearch

Utility pura per sanitizzare input utente prima di usarli in filtri PostgREST like/ilike — rimuove caratteri speciali che potrebbero alterare la semantica del filtro o causare query non valide.

Cos'è

sanitizePostgrestSearch è una funzione utility pura (no side effect, no async) che ripulisce una stringa di input utente prima dell'inserimento in un filtro PostgREST like/ilike. Rimuove i caratteri che hanno significato sintattico per il parser PostgREST e che, se non sanitizzati, possono:

  • alterare la semantica del filtro (operatori innescati per sbaglio)
  • causare errori HTTP 400 (querystring non valida)
  • aprire vettori di iniezione a livello di filtro

Signature

function sanitizePostgrestSearch(input: string): string
ParametroTipoDescrizione
inputstringStringa grezza fornita dall'utente (es. campo di ricerca)

Ritorna: la stringa con i caratteri speciali rimossi.

Caratteri rimossi

CarattereMotivazione
*Wildcard PostgREST nei pattern like/ilike
.Separatore operator.value nella sintassi PostgREST
,Separatore di elementi nei filtri compositi (in.(a,b,c), or=(...))
(, )Delimitatori di gruppi (in.(...), or=(...), and=(...))
&Separatore di query parameter URL
=Assegnazione query parameter
<, >Possibili confusioni con operatori in URL non encoded
!Modificatore negazione (not.ilike)
@Operatore esteso (es. @@ per FTS)

L'implementazione applica una semplice regex: input.replace(/[*.,()&=<>!@]/g, '').

Esempi prima/dopo

InputOutputNote
'Mario Rossi''Mario Rossi'Nessuna modifica — input pulito
'mario@test.com''mariotestcom'@ e . rimossi
'(ACME)''ACME'Parentesi rimosse
'foo*bar''foobar'Wildcard rimosso
'A&B''AB'Separatore URL rimosso
'10,20,30''102030'Virgole rimosse

Quando usarlo

Ogni volta che un valore di input utente finisce in un operatore like o ilike di una query PostgREST. Tipicamente in barre di ricerca, filtri free-text e autocomplete.

PostgREST processa la querystring come parte della query SQL: caratteri come ,, (, ) cambiano la struttura del filtro e possono esporre il backend a comportamenti inattesi. Anche se non si tratta di SQL injection classico (PostgREST usa prepared statements per i valori), un attaccante può comunque alterare la logica del filtro o triggherare errori 400. Sanitizza sempre l'input prima di concatenarlo.

Esempio: barra di ricerca

<script setup lang="ts">
import { ref, watch } from 'vue'
import { useMfeContext } from '@pzeta/mfe-contracts'
import {
  PostgrestMfeService,
  sanitizePostgrestSearch,
} from '@pzeta/postgrest/mfe'
import { debounce } from '@pzeta/mfe-contracts/utils'

interface Cliente {
  idanagrafica: number
  denominazione: string
}

const { http } = useMfeContext()
const service = new PostgrestMfeService(http)

const query = ref('')
const risultati = ref<Cliente[]>([])

const search = debounce(async (raw: string) => {
  const safe = sanitizePostgrestSearch(raw)
  if (safe.length < 3) {
    risultati.value = []
    return
  }
  const { data } = await service.get<Cliente>('anagrafica', {
    filters: { denominazione: `ilike.*${safe}*` },
    limit: 20,
  })
  risultati.value = data
}, 300)

watch(query, (q) => search(q))
</script>

<template>
  <input v-model="query" placeholder="Cerca cliente..." />
  <ul>
    <li v-for="r in risultati" :key="r.idanagrafica">
      {{ r.denominazione }}
    </li>
  </ul>
</template>

Esempio: filtro multi-colonna con OR

const safe = sanitizePostgrestSearch(query.value)

// Cerca in più colonne con OR
const { data } = await service.get<Cliente>('anagrafica', {
  filters: {
    or: `(denominazione.ilike.*${safe}*,codicefiscale.ilike.*${safe}*,partitaiva.ilike.*${safe}*)`,
  },
})

Limitazioni

  • Distruttivo: caratteri rimossi non sono recuperabili. Se la ricerca deve preservare la sintassi (es. email con @), usa un approccio diverso (escape selettivo o tokenizzazione).
  • Non gestisce wildcard come opzione: se vuoi permettere all'utente di usare * esplicitamente per wildcard, costruisci una pipeline di sanitizzazione custom.
  • Non sostituisce l'encoding URL: URLSearchParams / Axios fanno l'encoding finale; sanitizePostgrestSearch agisce a un livello semantico più alto.

Tipi correlati