Latest web development tutorials

iniezione SQLite

Se il tuo sito web consente agli utenti di inserire, e inseriti nella banca dati SQLite, questa volta si trovano di fronte a un problema di sicurezza è conosciuta come SQL injection. Questo capitolo mostrerà come evitare che ciò accada, e per garantire le dichiarazioni SQLite di script di sicurezza.

Iniezione di solito si verifica quando si richiede l'input dell'utente, come ad esempio l'utente deve inserire il nome, ma l'utente ha inserito una dichiarazione SQLite, e questa dichiarazione verrà eseguito sul database inconsciamente.

Mai dati forniti dall'utente fiducia, l'elaborazione dei dati in modo che solo convalidato, la regola è fatto da pattern matching. Nel seguente esempio, il nome utente nome utente è limitato a caratteri alfanumerici o underscore, la lunghezza deve essere compresa tra 8-20 caratteri - a seconda delle necessità di modificare queste regole.

if (preg_match ( "/ ^ \ w {8,20} $ /", $ _GET [ 'username'], $ partite)) {
   $ Db = new SQLiteDatabase ( 'filename');
   $ Risultato = @ $ db-> query ( "SELECT * FROM utenti WHERE username = $ matches [0]");
} Else {
   echo "nome utente non accettato";
}

Per dimostrare questo problema, prendere in considerazione questa ipotesi estratto: Per dimostrare il problema, si consideri questo estratto:

$ Name = "Qadir '; DELETE FROM utenti;";
@ $ DB-> query ( "SELECT * FROM utenti WHERE username = '{$ nome}'");

chiamata di funzione per recuperare il nome della colonna specificata dal nome utente corrisponde il record dalla tabella utente. Incircostanze normali, $ nome contenga solo caratteri alfanumerici e spazi, come ad esempio ilia stringa.Ma qui, a $ nome ha aggiunto una nuova query, le chiamate al database per evitare problemi catastrofici: iniettato query di eliminazione per eliminare tutti i record di utenti.

Anche se non ci è permesso di eseguire l'interfaccia di query o il database impilare più query in una singola chiamata di funzione, se si tenta di impilare la query, quindi la chiamata non riesce, ma SQLite e PostgreSQL sono ancora accatastate nella query, che prevede l'esecuzione di una stringa tutte le query, che possono causare gravi problemi di sicurezza.

iniezione Prevenire SQL

In linguaggi di scripting come Perl e PHP, si può abilmente gestire tutte il carattere di escape. PHP fornisce la programmazione stringa lingua funzionisqlite_escape_string () per SQLite è usato per sfuggire ingresso caratteri speciali.

if (get_magic_quotes_gpc ()) 
{
  $ Name = sqlite_escape_string ($ name);
}
$ Risultato = @ $ db-> query ( "SELECT * FROM utenti WHERE username = '{$ nome}'");

Anche se i dati sono codificati in modo che l'inserto messo in sicurezza, ma renderà semplice confronto di testo, nella query, la colonna contienedati binari, COME clausola non è disponibile.

Si prega di notare, addslashes () non devono essere richiamate nel stringa di query SQLite, porterà a risultati strani quando si recuperano i dati.