Perché la protezione contro l'iniezione SQL non è una priorità?


39

Su Stack Overflow, vedo molto codice PHP in domande e risposte che hanno query MySQL che sono altamente vulnerabili agli attacchi di iniezione SQL, nonostante le soluzioni alternative di base siano ampiamente disponibili per più di un decennio.

C'è un motivo per cui questi tipi di frammenti di codice sono ancora in uso oggi?


37
dare la colpa a tutorial online scritti male. il più delle volte, le persone sono semplicemente copia e incolla qualunque codice trovino in rete. JavaScript è anche un'altra vittima di tale pratica.
KJYe.Name

34
Dai la colpa ai blog. Oh, e W3Schools ...
Brian Driscoll,

13
Sì, assolutamente W3Schools - vedi w3fools.com
DisgruntledGoat

2
Vedo costantemente le persone che avvertono dell'iniezione di sql - quindi non penso nemmeno che la premessa di questa domanda sia valida. Esso è una priorità.
GrandmasterB

3
Quello che vedo in molte delle risposte è che è più facile insegnare PHP criticamente rotto che insegnare, bene, PHP che non è criticamente rotto. Non puoi accettare tale argomento e sostenere ancora che PHP non è un linguaggio
volgare

Risposte:


34

Penso che sia principalmente dovuto a) ignoranza b) pigrizia. I principianti di solito non sanno molto dell'iniezione di sql, e anche quando ne sentono parlare, lo ignorano perché è molto più semplice e facile da programmare in quel modo.


8
Ho provato a correggere tali cose altrove, solo per dirmi che non è rilevante per il problema in questione. Quindi, poiché molte persone preferiscono un semplice hack a una soluzione leggermente più complessa, gli esempi negativi vengono lasciati soli.
10

6
Alla maggior parte delle persone non interessa davvero l'iniezione di SQL fino a quando non ne vengono colpiti. Poi all'improvviso si chiedono dove siano finiti i loro tavoli.
Joel Etherton,

1
L'altro motivo è che l'iniezione SQL non è sempre considerata una preoccupazione rilevante per le app interne. (Non che abbiano ragione.)
John Fisher il

1
Non dimenticare che le risposte sono lì per rispondere alla domanda. Spesso è lo pseudo-codice (o SQL) a rispondere alla domanda, non necessariamente a fornire una soluzione copia e incolla sicura (nonostante come la risposta possa essere utilizzata nella realtà).
Dalin Seivewright,

1
@ l0b0 Conosco qualcuno che ha indotto le persone a prendere sul serio le correzioni di iniezione SQL dimostrando effettivamente un attacco di iniezione SQL contro l'attuale codice di produzione.
user16764

26

PHP rende deliberatamente molto, molto facile per le persone che sanno molto poco creare utili pagine Web dinamiche. Ciò significa che PHP attirerà molti principianti, che creano qualcosa di utile, imparano da altri esempi dall'aspetto utile e si voltano per insegnare agli altri come fare questa cosa interessante e utile. Il risultato è un sacco di codice errato e una scorta di programmatori che non conoscono meglio.

Non fa che peggiorare il fatto che gran parte dei programmatori competenti non voglia avere nulla a che fare con PHP. Ciò riduce la base di persone esperte che desiderano insegnare meglio agli altri. Ma perché evitano PHP? Bene per una combinazione di fattori. In parte non gli piace affrontare le verruche linguistiche. E in parte è perché preferirebbero lavorare con un buon codice e non c'è molto buon PHP là fuori.

Questa esatta costellazione di problemi utilizzati per infliggere Perl. A titolo di esempio lampante, prendiamo in considerazione il caso di Matt Wright, un adolescente entusiasta che ha iniziato a fornire molti script CGI utili, ben documentati e facili da installare negli anni '90. Sfortunatamente non capiva nulla della sicurezza, e nemmeno le persone che volevano usare le sue cose. Il risultato è stato il Matt Wright Script Archives, un flusso infinito di problemi di sicurezza per i primi script CGI. Nonostante sforzi come http://www.scriptarchive.com/nms.html , il problema non è migliorato per Perl fino a quando i provider di hosting condiviso hanno reso PHP più conveniente di ogni altra cosa. Ciò ha portato al problema nel passaggio da Perl a PHP.


Come hai detto, il problema non è il perl o il PHP, è che queste lingue consentono ai principianti di fare molte cose, il che è positivo, ma non sempre forniscono modi per farli bene che sono altrettanto ovvi.
Zaccaria K,

2
@ZacharyK: Non è allora colpa della lingua per impostazione predefinita?
Corse di leggerezza con Monica

6
@ tomalak-geretkal: usi la parola "difetto" come se rendere possibile fare cose è una cosa negativa. Le stesse caratteristiche che portano a molti codici errati portano anche a molti problemi reali risolti. Non è chiaro che questa sia una cosa negativa nel complesso.
btilly

Re 'fault': se HTML (o meglio i browser che lo interpretano) fossero stati tolleranti ai guasti come XSL, non ci sarebbe mai stato un world wide web ...
Benjol,

8

Sfortunatamente ci sono tonnellate di tutorial PHP più che cattivi là fuori e alcuni vecchi libri PHP hanno anche fatto schifo nel dire alle persone di scrivere il codice corretto (non usando register_globals ecc.).

Inoltre, magic_quotes_gpcessendo stato abilitato in passato, alla gente non importava di scappare perché "semplicemente funzionava".


4

Personalmente, credo che PHP sia facile da usare, quindi naturalmente è facile da usare in modo improprio.


2

Come essere umano e programmatore, trovo straordinariamente facile commettere errori e trascurare certe cose, specialmente quando viene premuto per il tempo.

È facile, e forse anche troppo allettante, incolpare una certa lingua, per essere troppo accessibile per il suo bene. Ma questo sarebbe sorvolando il più grande problema della fallibilità umana, indipendentemente dalla lingua scelta per programmare.

Certo, abbiamo fatto molta strada dal linguaggio assembly, e penso che sarei una programmazione molto più produttiva in un linguaggio più moderno, come PHP, Python, Ruby o Java.

PHP (e altri linguaggi di scripting) hanno infatti abbassato la barriera all'ingresso. Ciò può significare che un numero maggiore di principianti nella programmazione prova prima PHP. Ma ciò non significa certamente che tutti i programmatori PHP siano in qualche modo meno qualificati o meno in grado di imparare dai propri errori rispetto ai programmatori di altre lingue.

Rasmus Lerdorf ha creato PHP nella sua forma originale nel 1994, da allora si è notevolmente evoluto. Nella sua incarnazione più moderna, supporta la programmazione orientata agli oggetti, nonché splendidi framework, come Symfony. PHP come linguaggio si è liberato dai suoi vincoli originali ed è cresciuto per offrire una grande flessibilità nel modo in cui i programmatori possono scegliere di usarlo. Puoi usarlo per creare uno script di 9.000 righe di codice spaghetti, oppure puoi utilizzarlo nel contesto di un moderno framework MVC, come Symfony: è la tua scelta!

Sospetto fortemente che le vulnerabilità della sicurezza non siano limitate a una sola lingua. È allettante scrivere tutti i programmatori PHP come in qualche modo meno capaci o più inclini a scrivere codice insicuro. Ma mi chiedo quanto di ciò sia il pregiudizio della lingua e quanto di fatto sia vero?


Non ho parlato di "tutti i programmatori PHP".
Corse di leggerezza con Monica,

2

Penso che parte del problema siano le persone che semplicemente copiano il codice senza preoccuparsi di imparare quello che stanno facendo, ma davvero secondo me il modo in cui insegniamo il porgamnming è rotto ed è uno dei motivi per cui c'è così tanto codice cattivo. Insegniamo la sintassi fuori dal contesto e quindi i principianti non sanno quando usare qualcosa e quando non farlo o quali problemi la sintassi intende risolvere e quali problemi non intende risolvere. Quindi usano un martello quando una chiave sarebbe stata lo strumento migliore.

Ad esempio, invece di insegnare solo la sintassi, organizzi il corso come (Chiaramente ci sarebbero più passaggi, questo è solo un esempio di base di costruire da problemi di base a problemi più complessi piuttosto che insegnare solo la sintassi):

  1. Ecco come impostare una pagina Web di base
  2. Questo è il modo in cui la pagina Web estrae i dati da un database
  3. Ecco come inviare i dati da una pagina Web a un database
  4. Ecco come ti assicuri che vengano inviati i dati giusti.
  5. Ecco come proteggere il database dall'immissione di dati dannosi

questo è più o meno il modo in cui mi è stato insegnato php +1
Rémi l'

1

Penso che troverai una quantità simile di esempi MS SQL + ASP / ASP.NET altrettanto vulnerabili.

Sento che il problema deriva in parte dal fatto che quando stai provando a insegnare qualcosa, ad esempio filtrando i dati utilizzando una clausola WHERE, allora non vuoi davvero ingombrare il tuo esempio sfuggendo correttamente alla stringa di query o utilizzando un comando parametrizzato.

Ho addestrato gli sviluppatori per molti anni e posso entrare in empatia con le persone che scrivono codice orribile in tutorial. A volte è il più facilmente comprensibile. Tuttavia, a parte sottolineo sempre il codice vulnerabile e lo trasformo in un argomento secondario interessante.


6
Non dovrebbe essere un lato. Questo dovrebbe far parte della lezione di base. Forse con un grosso, grasso, avvertimento sul modo sbagliato di fare le cose. Le persone tendono a tagliare e incollare ciò che vedono per la prima volta e tu vuoi davvero che sia il modo giusto di fare le cose.
btilly

Certamente nel mondo di .NET la parametrizzazione è abbastanza semplice in questi giorni e dovrebbe davvero essere roba da "pagina uno".
Alan B,

1

L'autore originale di PHP, Rasmus Lerdorf , nel suo famigerato post sul blog sostiene lo sviluppo "no-framework" . Sebbene per le query SQL utilizzi PDO, non vi è alcun rischio di iniezione SQL. Ancora piuttosto brutto e obsoleto rispetto ai moderni framework MVC con i livelli ORM.


5
È certamente possibile progettare eccessivamente i siti con framework complessi di cui non hai bisogno. Direi che i suggerimenti di The Rasmus sono quasi pericolosi, ma c'è sicuramente una via di mezzo sana.
Corse di leggerezza con Monica

al giorno d'oggi l'utilizzo di ORM non è eccessivamente ingegneristico; è standard. Quindi sta usando il modello MVC.
vartec,

3
@vartec: E 'poco "standard" solo perché tutte le pecore stanno usando (e, per quel che vale, nemmeno tutte le pecore stanno usando). Per script di piccole dimensioni può essere facilmente troppo ingegneristico.
Lightness Races con Monica

1
@Tomalak: è standard, perché è questo il modo di implementare progetti puliti e sostenibili. "piccoli script" tendono a crescere nel tempo e si trasformano in mostruosità non mantenibili.
vartec,

2
@vartec: Penso che tu abbia frainteso il significato di "standard".
Lightness Races con Monica

1

Puoi incolpare questa povera pratica sul PHP stesso. Le versioni legacy di PHP (fino al 2006 circa) sfuggirebbero a tutte le variabili di input GET e POST in modo che fossero adatte all'interpolazione delle query del database BY DEFAULT. Vedi http://php.net/manual/en/security.magicquotes.php


2
C'è stato un tempo in cui sarebbe sfuggito a TUTTE le variabili come se stessero andando in MySQL in modo specifico, sia che lo siano mai state o meno . Nota per i progettisti linguistici: quando ti accorgi di dover implementare stripslashes(), hai già sbagliato.
Dan Ray,

0

Non confondere lo scopo di un tutorial, che è quello di dimostrare qualcosa semplicemente, con ciò che dovrebbe essere fatto in un ambiente di produzione. Ad esempio, la maggior parte del codice tutorial che ho scritto ha poca o nessuna verifica di errori / eccezioni. Cerco di ricordare al lettore che il codice dimostra solo come eseguire un'attività specifica, non come coprire tutti i possibili risultati.


3
Siamo spiacenti, ma nessun codice di esempio dovrebbe mai mescolare le query mySQL con PHP. Questo è semplicemente sbagliare.
Raynos,

1
E irresponsabilmente.
Lightness Races con Monica il

-1 per most tutorial code I have written has little or no error/exception checking..
yannis,

Vedo il punto del PO. Irresponsabile è quando un datore di lavoro assume un ragazzo a cui manca la conoscenza dell'iniezione SQL e simili.
Raffael,

Penso che questo approccio sia difendibile se si includono commenti direttamente nel codice dicendo "Non usare questo in produzione!". In questo modo la copia / paster non hanno scuse.
Benjol,

-1

Quando stavo imparando PHP ho guardato alcuni di questi libri PHP + MySQL e sì, sento che contribuisce a quella cattiva pratica. Ma ho simpatia, perché insegnano la lingua , non buone pratiche di programmazione. Altrimenti dove finirebbe?


2
Ma quando insegni la lingua, dovresti comunque usare le API preferite nei tuoi esempi. Come sempre usa la forma parametrica delle query SQL, possibilmente con una nota a piè di pagina come "Non pensare mai di usare l'interpolazione per costruire SQL. Sembra un po 'più semplice, ma è estremamente soggetto a vulnerabilità della sicurezza".
Jan Hudec,

Sì, buoni punti. Le note a piè di pagina sarebbero un buon promemoria e questo vale anche per i tutorial online. In ogni caso, sarebbe bello se gli autori di libri di tutte le lingue potessero incorporare i consigli di OWASP nei testi per principianti. Anche solo come riferimento. La Fondazione OWASP fa un buon lavoro.
Steve Rathbone,

@indifferentDrum: puoi anche insegnare alle persone a guidare con i piedi - non significa che sia una buona idea.
Lightness Races con Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.