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

Base64 come metodo di sanificazione dell'input utente per Mysql

Non "igienizzare" input come mezzo per prevenire SQL Injection - usa i segnaposto (o una corretta evasione) , sempre. Sii coerente. Stai attento. Il problema è già risolto.

Questo caso sarà "sicuro" a causa del dominio limitato del base64_encode funzione. Tuttavia..

è la cattiva pratica e la memorizzazione di valori con codifica base64 (in modo tale che la query mostrata possa funzionare) comporta diversi negativi implicazioni mentre cambia le informazioni memorizzate:distrugge l'ordinamento dei valori, rende le informazioni non banalmente ricercabili , richiede un aggiuntivo passaggio "codifica/decodifica" e persino consuma più spazio - ahi!

Pertanto, sebbene possano esserci casi specifici per codificare i dati in base64, questo approccio non adatto come mezzo per mitigare SQL Injection .

Il problema è dovuto all'accesso a SQL tramite un protocollo di testo dove il comando/forma della query e valori sono mescolati. L'uso di corretto tecniche di fuga (ad es. mysql_real_escape_string ) risolve questo problema assicurando che le informazioni vengano salvate in modo che il testo SQL venga analizzato come previsto, tuttavia, a differenza di un passaggio di codifica base64, non effettivamente modificare le informazioni fornite!

Questo è esattamente cosa forniscono i segnaposto ! I segnaposto sono il approccio universalmente corretto e dovrebbe essere incoraggiato. I segnaposto consentono l'invio della query e dei valori al database separatamente quando supportato dalla libreria/database; e vengono emulati scappando in altro modo. L'utilizzo corretto del segnaposto elimina SQL injection e la necessità che il codice utente mescoli i valori nel testo del comando SQL, il che può anche semplificare la scrittura e la gestione delle query.

Per evitare che i "singoli programmatori" scrivano query terribili, la soluzione è prevenire query ad hoc dalla dispersione nel codice:raccogliere le operazioni di accesso ai dati in un livello di accesso ai dati ( DAL) (possibilmente in combinazione con un ORM) ed esporre solo le azioni pertinenti, garantendo un uso corretto di SQL all'interno del DAL. Nei progetti più semplici il DAL è anche un luogo adatto per gestire centralmente le regole aziendali per la sanificazione e altre logiche di validazione.

Più precisamente:

  • Igienizza valori per le regole aziendali; questo dovrebbe prevenire "informazioni errate", come un nome utente troppo breve, che contiene caratteri limitati o altrimenti non soddisfa i requisiti aziendali.

  • Utilizza segnaposto per prevenire SQL Injection . Questo è rigorosamente relativo al trasferimento dei dati in SQL e non ha alcuna relazione con le informazioni ivi contenute.

Mentre MySQL 5.6.1 aggiunge FROM_BASE64 , in modo tale che la codifica possa essere semplicemente utilizzata nel testo del comando SQL, ciò aggiunge comunque un ulteriore passaggio di decodifica esplicito e complica la query quando si utilizza tale schema di codifica. Questo approccio base64 è semplicemente non necessario, poiché esistono già tecniche collaudate per prevenire l'SQL injection, e non è stato proposto nella domanda iniziale.