2010-02-17 11 views
17

Ho il seguente codice:Devo usare mysql_real_escape_string se lego i parametri?

function dbPublish($status) 
{ 
global $dbcon, $dbtable; 

if(isset($_GET['itemId'])) 
{ 
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?'; 
    $stmt = $dbcon->prepare($sqlQuery); 
    $stmt->bind_param('ii', $status, $_GET['itemId']); 
    $stmt->execute(); 
    $stmt->close(); 
} 
} 

Devo mysql_real_escape_string in questo caso o sto bene?

+1

Si noti che solo i parametri sono immuni all'iniezione SQL; qualsiasi variabile interpolata direttamente nella stringa di query (come '$ dbtable') è un vettore potenziale, se il suo valore deriva dall'input dell'utente. Ovviamente, cose come i nomi di tabelle e colonne non dovrebbero mai venire direttamente dall'input dell'utente. – outis

risposta

27

No, non c'è bisogno di fuggire valore di te stesso (vale a dire senza non è necessario chiamare mysqli_real_escape_string), quando si utilizza istruzioni preparate: il motore DB lo farà se stessa.

(In realtà, se si stesse chiamando mysql_real_escape_string e utilizzando i parametri legati, le corde otterrebbero fuggiti due volte - che non sarebbe grande: che ci si finisce con la fuga caratteri ovunque ...)


come sidenote: i valori vengono passati come numeri interi (come indicato dalle 'ii'), in modo da non dover chiamare mysql_real_escape_string, anche se non stava utilizzando istruzioni preparate: come indica il nome, si utilizza questa funzione per sfuggire ... stringhe.

Per i numeri interi, in genere utilizzo solo intval per verificare che i dati che io inserisco nelle mie query SQL siano realmente numeri interi.

(Ma, come si sta utilizzando query preparate, ancora una volta, non c'è bisogno di fare quel tipo di fuga da soli)

1

No, non è necessario. La combinazione dei due risulterebbe in caratteri di escape visibili visualizzati nei tuoi dati.

0
function dbPublish($status)  
{  
global $dbcon, $dbtable;  

if(isset($_GET['itemId']))  
{  
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';  
    $stmt = $dbcon->prepare($sqlQuery);  
    $stmt->bind_param('ii', $status, $_GET['itemId']);  
    $stmt->execute();  
    $stmt->close();  
}  
}