Domanda

Ci scusiamo per non formattare il mio codice. la barra degli strumenti non c'era più ...

voglio inserire alcuni dati in un db mysql. Ho scritto una funzione in php:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

Nel campo URL del mio Browswe I'am chiamando la funzione del genere: http://www.justanexample.com/example.php?ID=123123123&token= qwertzuiop

che funziona.

Se metto uno spazio in uno dei due parametri, ad esempio così: http://www.justanexample.com/example.php?ID=123123 123 & di token = qwertzuiop

Nulla è stato aggiunto al mio DB MySQL.

Sarebbe bello avere un aiuto :) Grazie!

È stato utile?

Soluzione

La vostra funzione è vulnerabile a SQL injection. Si dovrebbe convalidare tutti i parametri dall'utente ricevuto prima di utilizzarli in una query SQL, e superare tutte le stringhe attraverso mysql_real_escape_string, perché poi ho potuto solo passare in qualcosa di simile example.php?token='; DROP DATABASE; e regalmente rovinare la vostra applicazione.

Nel tuo caso, si dovrebbe fare una verifica che i parametri ricevuti sono nella forma che si aspetta prima, restituire un errore per l'utente se non lo fanno, e solo allora passarli nella query SQL.

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

Si dovrebbe anche prendere in considerazione le query parametrizzate, che sono un modo complessivo molto migliore di fare query SQL con i parametri che solo tramite concatenazione di stringhe. Per questo, considerare di usare l'estensione mysqli invece di mysql, o ad un livello superiore, DOP.

Altri suggerimenti

Si dovrebbe convalidare l'ingresso prima di inviarlo al database. Oppure, se la convalida non è possibile, filtro e / o sfuggire il valore.

Validation

Se ci si aspetta ID per essere un numero intero maggiore di zero:

if (!ctype_digit($ID)) {
    // invalid ID
}

Se ci si aspetta gettone di essere una stringa alfanumerica:

if (!ctype_alnum($token)) {
    // invalid token
}

Filtri

Il filtraggio è la rimozione di parti non valide dell'ingresso in modo che diventi valida:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

Sfuggire

Escaping sta sostituendo i meta caratteri di un contesto specifico qualche stringa è destinato ad essere messi in Per MySQL query è necessario utilizzare una funzione che sfugge alle meta caratteri della contesto dichiarazione stringa in MySQL . PHP ha il mysql_real_escape_string funzione a tal fine:

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";

Rimuovi spazio da loro utilizzando la funzione str_replace ad esempio:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

Inoltre, ho il sospetto che il vostro $ ID è un campo intero della tabella in modo da poter eseguire la query senza specificare le citazioni ad esempio:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";

Il codice sta assumendo la query viene completata con successo, senza mai verificare se c'è stato un errore. Sto indovinando che sarà un errore di sintassi a causa degli spazi. Se il campo ID è un tipo intero, poi facendo ID=123 123 sarà l'errore di sintassi. Compreso tutto l'iniezione SQL e dati sanificazione consiglio nelle altre risposte, si dovrebbe riscrivere la funzione add_ID nel seguente modo:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

Almeno questo vi dirà se la query davvero riuscito, e ciò che ha fatto esplodere se non lo ha fatto. Mai dare per scontato che una query di database di qualsiasi tipo avrà successo. Ci sono troppi modi per farlo saltare in aria (server è morto, situazione di stallo delle transazioni, pool di connessione esaurito, lo spazio su disco, ecc ...) di non avere ancora un po 'di gestione come sopra errore semplicistico.

È possibile utilizzare str_replace per rimuovere gli spazi. Ma non è una buona pratica. Come può l'URL di essere modificato in modo? In casi normali è irreale. Al contrario, è necessario verificare tutti i valori di input da utente (ID deve essere un intero, Token non dovrebbe contiene "'" simbolo e altri controlli). Leggi sql-iniezioni.

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