sanitizePostgrestSearch
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
| Parametro | Tipo | Descrizione |
|---|---|---|
input | string | Stringa grezza fornita dall'utente (es. campo di ricerca) |
Ritorna: la stringa con i caratteri speciali rimossi.
Caratteri rimossi
| Carattere | Motivazione |
|---|---|
* | 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
| Input | Output | Note |
|---|---|---|
'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.
,, (, ) 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;sanitizePostgrestSearchagisce a un livello semantico più alto.
Tipi correlati
PostgrestMfeService— consumatore tipicoFilterUtils— utility per query strutturate (encoding già gestito)
PostgrestMfeService
Service PostgREST a basso livello per microfrontend basato su MFEHttpClient — espone get, getOne, post, patch, delete, rpc con mapping automatico di SQLSTATE in messaggi italiani.
usePostgrestPagination
Composable Vue 3 per gestire lo stato di paginazione PostgREST in un MFE — page/pageSize reattivi, offset calcolato, navigazione e reset.