Istruzioni MySQL che usano MySqli e PHP7. Come migrare alle istruzioni preparate?

1

Sto riprogettando un sito PHP / MySql che aveva circa 7 anni e aveva molte dichiarazioni MySql. Li avevo aggiornati tutti per usare MySqli, ma di recente ho sentito parlare di "istruzioni preparate", quindi ora mi chiedo se dovrei prendere il tempo per cambiare tutte le istruzioni MySqli per usare le istruzioni preparate.

Ad esempio, la maggior parte delle istruzioni mysql nel codice corrente seguono questo formato generale ...

$sql = "SELECT * FROM users
        WHERE userid = '$userid'";
            $getnotifyoption = mysqli_query($connection, $sql);
            if (!$getnotifyoption ) {
            die("Database query failed: " . mysqli_error());
            } else {
                while ($row = mysqli_fetch_array($getnotifyoption )) {
                $firstname=$row['firstname'];
                //etc
                }
            }

Ovviamente è un SELECT, ma ho anche molte istruzioni INSERT che seguono lo stesso formato generale. E se inserissi un nome nel database, lo farei per primo ...

$firstname=mysqli_real_escape_string($connection,$_POST['firstname']);

Dalla mia recente lettura, sembra che sia una buona cosa da fare, ma sicuramente non così sicuro da SQL injection come potrebbe / dovrebbe essere.

Ora sto leggendo delle dichiarazioni preparate e sto lottando per afferrarle completamente (se qualcuno ha qualche buon tutorial per qualche neofita, per favore condividi un link). E se qualcuno si sente generoso, fammi sapere come l'affermazione di esempio che ho dato in precedenza sarebbe stata riscritta usando una dichiarazione preparata. Ma a parte questo ...

Devo installare qualcosa per usare le istruzioni preparate, o funzionano semplicemente all'interno del mio ambiente mysqli / php7?

Ancora più importante, il feedback che sto cercando è se pensi che dovrei sicuramente aggiungere quello che penso sarebbe tempo significativo per la riprogettazione e tornare indietro e modificare TUTTE le mie istruzioni MySqli per utilizzare istruzioni preparate?

Quanto più efficiente / sicuro sono le dichiarazioni preparate rispetto al formato che uso sopra?

La mia strada è TERRIBILE, o è OK da usare per ora?

Alla fine la mia strada non funzionerà? Se è così, stiamo parlando di un anno o come 10 anni? (lo so probabilmente non posso rispondere :) :)

    
posta user3304303 24.06.2017 - 15:50
fonte

1 risposta

2

Generare dinamicamente istruzioni SQL interpolando le variabili è disapprovato, perché è troppo facile dimenticare di sfuggire prima a tali variabili. Quindi il tuo attuale modo di eseguire SQL è molto incline agli errori. Devi solo dimenticare di eseguire l'escape una volta per aprire il tuo sito Web fino agli attacchi di SQL injection.

Le istruzioni preparate sono come definire una funzione che puoi chiamare in un secondo momento. Non si genera dinamicamente il codice, ma si fornisce solo una serie di parametri. Il vantaggio principale è che non devi preoccuparti di eseguire l'escape: il driver del database è ora responsabile della gestione sicura dei dati. Inoltre, si evita di analizzare più volte la stessa istruzione SQL: le istruzioni preparate vengono riutilizzate, il che può migliorare le prestazioni.

PHP ha due opzioni per le istruzioni preparate:

  • L'interfaccia mysqli ha funzioni $stmt = mysqli_prepare($mysqli, "SQL") e $stmt = $mysqli->prepare("SQL") . La stringa SQL può contenere ? come segnaposti per il valore che è possibile associare in seguito all'istruzione prima di eseguirla. Funziona, ma è un po 'fastidioso.

  • L'interfaccia PDO ha una funzione $stmt = $pdo->prepare("SQL") . La stringa SQL può contenere il nome :placeholders . Quando si esporta un'istruzione preparata, è necessario fornire una matrice valore-valore per i valori dei parametri. L'utilizzo di PDO è il modo preferito per accedere ai database da PHP.

Per dettagli ed esempi, leggi le sezioni appropriate nel manuale PHP.

Quindi aggiornare il tuo codice per utilizzare istruzioni preparate vale la pena?

La sicurezza potenzialmente migliorata derivante dall'uso di dichiarazioni preparate può o non può avere un valore aziendale sufficiente. Questo è fondamentalmente un controllo se cost of breach * (probability of breach before fixing - probability of breach after fixing) > cost of fixing . Ma poiché ciò coinvolge "incognite sconosciute", è praticamente impossibile stimarlo. Un altro modo per esaminare questo è se il costo di una violazione potrebbe essere critico per l'azienda, ad es. attraverso la perdita di immagine pubblica, risposta normativa o costi di difesa legale. Se è così, investire in buone pratiche di sicurezza sembra saggio.

Se l'applicazione è in manutenzione attiva e hai già familiarità con il codice, il costo del passaggio alle istruzioni preparate è molto basso, probabilmente dell'ordine di 5 minuti per istruzione. Con un po 'più di sforzo, questo può essere usato allo stesso tempo per migliorare l'architettura del codice, ad es. introducendo un livello di accesso ai dati pulito che concentra tutte le interazioni DB.

    
risposta data 25.06.2017 - 11:40
fonte

Leggi altre domande sui tag