Perché SQL non esegue l'escape / sanitizzazione per impostazione predefinita?

1

Innanzitutto, poiché non esiste SQL stackexchange non sono sicuro di dove sia il posto migliore per porre questa domanda (ho discusso tra qui e programmers.stackexchange). Se questo è il posto sbagliato, per favore spostalo.

È un difetto evidente in SQL che gli input non sono sterilizzati di default e l'input dell'utente può essere eseguito. Quando si progetta SQL, sicuramente i programmatori devono aver realizzato questo fatto? Perché allora non hanno messo alcuna protezione di default contro di essa, come l'escape di default, o ancora meglio, la rielaborano completamente in modo tale che gli input dell'utente non possano mai essere eseguiti.

Gli altri linguaggi, compilati o interpretati, (come Java, Python, C, ecc.) non sembrano soffrire di una vulnerabilità simile in cui è possibile eseguire l'input dell'utente. Perché allora SQL è davvero speciale in questo caso?

    
posta 1110101001 24.07.2015 - 00:42
fonte

1 risposta

17

SQL è un linguaggio di programmazione. Il problema non è la mancanza di SQL riguardo "l'igienizzazione degli input"; SQL è l'input, non qualcosa che riceve input.

Il problema sono le applicazioni che si attivano per generare automaticamente alcuni SQL basati su un mix casuale di elementi stringa di origine dubbia. Un'applicazione che soffre di una vulnerabilità di SQL injection, è un'applicazione che funge da generatore di codice . E la generazione automatica del codice è estremamente difficile da eseguire correttamente quando la sintassi del target era destinata al consumo umano - il generatore deve essere consapevole di tutti gli arcani dettagli dell'analisi ed evitare tutti i piccoli dettagli ed eccezioni che sono pensati per aiutare gli umani, ma fare la vita è molto dura per le macchine.

Tuttavia, quando è necessario eseguire istruzioni SQL con parametri forniti esternamente, esiste una soluzione pulita: si chiama istruzioni preparate . Supporto per database SQL e supporto per dichiarazioni lunghe e preparate. Non si può incolpare SQL per "non disinfettare input" perché SQL offre esattamente un metodo per "sanitizzare gli input"; dovresti dare la colpa agli sviluppatori per non usarlo.

(SQL può essere incolpato per un gran numero di altre cose, ma non per questo.)

    
risposta data 24.07.2015 - 02:30
fonte

Leggi altre domande sui tag