SQL injection per un modulo username / password?

-1

Ecco come avviene la convalida dell'utente sul mio sito:

if(!empty($_POST['username']) && !empty($_POST['password']))
{       
    $query = "SELECT * FROM users WHERE username='".$_POST['username']."' AND binary password='".$_POST['password']."'";

Tuttavia ho questo codice di pulizia dell'iniezione in esecuzione su ogni pagina caricata dal mio sito.

Tuttavia, sto provando a sviluppare un elenco di attacchi di combinazioni di nome utente / password intelligenti che verifichino se posso ottenere l'accesso non autorizzato al sistema.

Roba come:

  1. %%, %%
  2. *, *
  3. ' OR '1'='1, ' OR '1'='1
posta Steve 10.02.2011 - 13:28
fonte

4 risposte

12

Finché si utilizza l'SQL dinamico, SQL-Injection rimane un vettore di attacco aperto. Se si desidera proteggere contro SQL-Injection, la strada da percorrere è utilizzando query parametrizzate. Sospetto che tu stia usando PHP + MySQL, quindi questo sarebbe un esempio di una query parametrizzata.

$dbh = new PDO('mysql:host=localhost;dbname=example', 'user', 'password');
$sth = $dbh->prepare('SELECT * FROM users WHERE username=? AND binary password=?');
$sth->execute(array($_POST['username'], $_POST['password']));
$result = $sth->fetch_all();

Naturalmente, spogliare l'input dell'utente da caratteri illegali potrebbe essere ancora qualcosa che si vuole fare, anche se il tuo sito potrebbe essere protetto da SQL-Injection, gli utenti potrebbero comunque essere attaccati tramite XSS. Quindi suggerisco una combinazione di entrambe le tecniche.

    
risposta data 10.02.2011 - 13:52
fonte
3

Sarei d'accordo con mike, che usando le query parametrizzate puoi eliminare le iniezioni SQL, ma ancora una volta dipende da come sono costruite.

Direi che usare una lista bianca è sempre meglio che usare una lista nera. Quando proviamo ad elencare i tipi di attacchi, ci sarà sempre la possibilità che un attacco salti. Come hai già detto filtrando 1 = 1 ma poi a = a, me = me produrrà lo stesso risultato .... Quindi la whitelisting aiuterebbe dove inizialmente accetti solo quello che vuoi e scarti gli altri usando regex ... quindi query parametrizzate .. .

    
risposta data 17.02.2011 - 22:19
fonte
2

La migliore risposta a questa domanda è di annullare la domanda. Il codice che mostri è vulnerabile e l'unico modo ragionevole per risolvere la vulnerabilità è quello di correggere il codice. La soluzione migliore consiste nell'utilizzare un'istruzione preparata o una query parametrizzata: non utilizzare la concatenazione di stringhe per creare query SQL. Raccogliere esempi di attacchi non porterà a una difesa efficace contro gli attacchi SQL injection. Le probabilità sono, ci sarà sempre un altro attacco non sulla tua lista.

    
risposta data 10.02.2011 - 21:22
fonte
0

Sono d'accordo con le risposte di cui sopra - basta correggere il codice per sicurezza. Ma raccomando anche qualche tipo di raccolta di dati dal sito live, in modo che qualcuno che sta tentando gli attacchi possa essere bannato.

    
risposta data 11.08.2012 - 23:02
fonte

Leggi altre domande sui tag