SQL Injection è possibile in questo script di registrazione PHP? [chiuso]

0

Ho recentemente creato uno script di registrazione PHP per un sito web su cui un amico e io stiamo lavorando. Ho letto i pericoli dell'iniezione di MySQL e mi chiedevo se il mio codice attuale fosse protetto da tali attacchi, o se fossero necessari ulteriori passaggi.

La parte rilevante del codice è la seguente

  $email = $_POST['email'];
  $username = $_POST['username'];

  $username = strip_tags(trim($username));
  $email = strip_tags(trim($email));

  //Sanitation code I found somewhere..
  function mres($var){
    $conn = get_my_db();

    if (get_magic_quotes_gpc()){
        $var = stripslashes(trim($var));
    }
    return $conn->real_escape_string(trim($var));
  }

  //Sanitize username
  $sanUsername = mres($username);

  //Make SQL query
  $sql = "SELECT username FROM accounts WHERE username = '$sanUsername' ";
  $result = $conn->query($sql);

Grazie in anticipo,

Shawn

EDIT:

Ho aggiornato la query SQL al seguente per utilizzare le istruzioni preparate

  //Prepare statement
  $prep = $conn->prepare("SELECT username FROM accounts WHERE username = ?");
  $prep->bind_param("s", $sanUsername);
  $prep->execute();
  $result = $prep->get_result();
    
posta Shawn Anastasio 24.12.2014 - 07:24
fonte

1 risposta

4

Stai utilizzando l'approccio sbagliato per prevenire l'iniezione SQL. La disinfezione degli input può aiutare a garantire la sicurezza, ma il modo migliore per evitare l'SQL injection è rimuovere la cosa che ha permesso in primo luogo: il codice di mixaggio e i dati (forniti dall'utente) nella stessa stringa, così che il database non lo fa so cosa avrebbe dovuto essere il codice e cosa avrebbe dovuto essere i dati.

Non c'è più bisogno di farlo in SQL, e tu vuoi esaminare istruzioni preparate . Il modo in cui lavorano è che prima si invia al database tutto tranne i dati effettivi; il database compila la query e solo allora fornisci i dati effettivi della query. Ciò significa che i dati forniti dall'utente vengono collocati dal server in specifici slot nella query e non possono modificare ciò che sta facendo il server.

Per essere più esplicito, invii al server qualcosa come SELECT username FROM accounts WHERE username = ? . Il server elabora questa query (il titolare preparato ), trasformandola in una funzione che aspetta solo un valore per il nome utente. Quindi associa il nome utente specifico all'istruzione e lo esegue. La chiave è che il server conosce già esattamente cosa dovrebbe fare prima di vedere i dati dell'utente; nulla che un utente malintenzionato mandi può cambiare ciò che il database sta per fare (cioè trovare le righe con il nome utente specificato e restituire il loro nome utente).

La disinfezione degli input del database è fondamentalmente un tentativo di mitigare un vettore di attacco bloccando gli input che lo sfruttano. Le istruzioni preparate in realtà rimuovono questo vettore di attacco, perché eliminano le condizioni che gli hanno permesso di esistere.

I dettagli su come utilizzare le istruzioni preparate variano in base alla lingua, al framework e al server del database; cercare la documentazione PHP / MySQL per i dettagli reali.

    
risposta data 24.12.2014 - 08:04
fonte

Leggi altre domande sui tag