Convalida i nomi di colonne e tabelle del database per impedire SQLi?

3

Esistono alcuni tipi di software, come ORM e builder di query, che devono concatenare nomi di colonne e tabelle in query SQL. Dal momento che gli sviluppatori mettono apparentemente dati non attendibili in tutti i tipi di posizioni senza pensieri secondari, una strategia ragionevole per una tale libreria sarebbe quella di verificare che il nome fornito sia effettivamente un nome e non un attacco SQLi.

Un modo semplice per farlo sarebbe quello di confrontare una regex come /[a-zA-Z_]+/ . Tuttavia, ciò limiterebbe i nomi delle colonne che possono essere utilizzati. Molti DBMS sono abbastanza liberali su quali nomi di colonne autorizzano e non voglio introdurre restrizioni artificiali.

Quindi, quello che sto cercando è un approccio per convalidare o disinfettare i nomi delle colonne e delle tabelle del database. Potrebbe essere un ordine alto, ma idealmente sarebbe:

  1. Funziona con tutti i principali database - Postgres, MySQL, Oracle, MSSQL, ecc.
  2. Limita i nomi delle colonne che possono essere utilizzati il meno possibile.
  3. Essere immune a SQLi.

I compromessi possono essere fatti in relazione a # 1 e # 2, ma non # 3.

    
posta Anders 16.03.2018 - 00:51
fonte

1 risposta

1

Penso che la tua migliore scommessa sia quotare. Lo standard SQL-99 specifica che il doppio preventivo (") è usato per delimitare gli identificatori (ma il tuo chilometraggio con vari DB varierà). Questa domanda ha qualche informazione in più su come questo viene gestito attraverso i database.

Oracle ha una funzione specifica per questo DBMS_ASSERT.ENQUOTE_NAME - ma se stai cercando di passare da una piattaforma all'altra, dovrai farlo tu stesso. Doppi la citazione del nome, ma controlla le doppie virgolette nella stringa e rifiuta la stringa se non sono sfuggite (accoppiate).

    
risposta data 24.03.2018 - 01:45
fonte

Leggi altre domande sui tag