Mysql
 sql >> Database >  >> RDS >> Mysql

Sql Injection protection con solo str_replace

Questo esempio isolato è invulnerabile all'iniezione.

Ma devi renderti conto che la protezione da sql injection non è solo una sostituzione di caratteri . E le circostanze possono differire da quelle che al momento dai per scontate. Quindi, il tuo codice diventerebbe vulnerabile a lungo termine, a causa di inconvenienti essenziali di questo metodo :

  • La sostituzione dei caratteri è solo una parte della formattazione richiesta
  • questa particolare sostituzione può essere applicata solo alle corde, lasciando le altre parti assolutamente prive di protezione.
  • tale sostituzione è esterna all'esecuzione di una query, il che significa che è soggetta a un errore umano di qualsiasi tipo.
  • tale sostituzione è una misura essenzialmente staccabile, il che significa che può essere spostata troppo lontano dall'esecuzione effettiva della query e alla fine dimenticata.
  • Questo tipo di evasione è soggetto a attacco di codifica , rendendo la soluzione troppo limitata nell'uso.

Non c'è niente di sbagliato nella sostituzione dei caratteri di per sé, ma solo se viene utilizzata come parte della formattazione completa; applicato alla parte della query corretta; e fatto da un driver di database, non da un programmatore; subito prima dell'esecuzione.

Le funzioni che hai proposto nei commenti sono un buon passo, ma ancora insufficiente, essendo oggetto degli inconvenienti sopra elencati, rendendole soggette a ogni sorta di errore umano.

E l'iniezione SQL non è l'unico problema con questo approccio, è anche un difetto di usabilità, poiché questa funzione rovinerebbe i tuoi dati, se utilizzata come incarnazione del recente citazioni magiche o rendere il tuo codice gonfio, se utilizzato per formattare ogni variabile direttamente nel codice dell'applicazione.

Tali funzioni possono essere utilizzate solo per elaborare un segnaposto , ma ovviamente non utilizzando una funzione di sostituzione fatta in casa, ma una funzione appropriata fornita dall'API del database.