Domanda

Ecco alcune possibilità per avviare la conversazione:

  1. Esci da tutti gli input durante l'inizializzazione.
  2. Escape ogni valore, preferibilmente durante la generazione dell'SQL.

La prima soluzione non è ottimale, perché è necessario rimuovere l'escape per ciascun valore se si desidera utilizzarlo in qualcosa di diverso da SQL, ad esempio visualizzarlo su una pagina Web.

La seconda soluzione ha molto più senso, ma sfuggire manualmente a ciascun valore è una seccatura.

ne sono consapevole dichiarazioni preparate, comunque trovo MySQLi ingombrante.Inoltre, separare la query dagli input mi preoccupa, perché sebbene sia fondamentale ottenere l'ordine corretto, è facile commettere un errore e quindi scrivere i dati sbagliati nei campi sbagliati.

È stato utile?

Soluzione

come afferma @Rob Walker, le query parametrizzate sono la soluzione migliore.Se stai utilizzando il PHP più recente e migliore, ti consiglio vivamente di dare un'occhiata a DOP (Oggetti dati PHP).Si tratta di una libreria di astrazione di database nativa che supporta un'ampia gamma di database (incluso ovviamente MySQL) nonché istruzioni preparate con parametri denominati.

Altri suggerimenti

Le dichiarazioni preparate sono la risposta migliore.Devi fare dei test perché puoi commettere errori!

Vedere Questo domanda.

Io utilizzerei dichiarazioni preparate.Se vuoi usare istruzioni preparate, probabilmente vorrai dare un'occhiata alle funzioni PDO per PHP.Ciò non solo ti consente di eseguire facilmente istruzioni preparate, ma ti consente anche di essere un po' più indipendente dal database non chiamando funzioni che iniziano con mysql_, mysqli_ o pgsql_.

Un giorno la PDO potrebbe valerne la pena, ma non è ancora arrivata.È un DBAL e il suo punto di forza è (presumibilmente) quello di rendere più semplice il passaggio da un fornitore all'altro.Non è realmente costruito per catturare iniezioni SQL.

In ogni caso, se vuoi scappare e sanare i tuoi input, usare dichiarazioni preparate potrebbe essere una buona misura (lo condivido).Anche se credo che sia molto più semplice, ad es.utilizzando filtro.

Ho sempre utilizzato la prima soluzione perché il 99% delle volte sono variabili $_GET, $_POST, E $_COOKIE non vengono mai inviati al browser.Inoltre, non scriverai mai erroneamente codice con un'iniezione SQL (a meno che non utilizzi virgolette nella query), mentre con la seconda soluzione potresti facilmente dimenticare di eseguire l'escape di una delle tue stringhe alla fine.

In realtà, il motivo per cui l'ho sempre fatto in questo modo è perché tutti i miei siti avevano l'impostazione magic_quotes attivata per impostazione predefinita e, una volta scritto molto codice utilizzando una di queste due soluzioni, ci vuole molto lavoro per cambiare all'altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top