2012-07-13 4 views
8

Possible Duplicate:
Best way to prevent SQL Injection in PHPPHP/MySQL - Miglior uso e la pratica di sfuggire stringhe

Qual è il modo migliore per sfuggire stringhe quando si effettua una ricerca? mysql_real_escape_string() sembra buono ma non so esattamente come usarlo correttamente.

Questo codice esegue correttamente il lavoro?

<?php 
    /* Let's say that the user types "'#""#''"\{(})#&/\€ in a textfield */ 
    $newStr = mysql_real_escape_string($str); 
    $query = "INSERT INTO table username VALUES ($str)"; 
    mysql_query($query); 
?> 

EDIT:

Ora ho questo codice:

 $email = $_POST['email']; 
    $displayName = $_POST['displayName']; 
    $pass = $_POST['pass1']; 

    $email = mysqli_real_escape_string($link, $email); 
    $displayName = mysqli_real_escape_string($link, $displayName); 
    $pass = mysqli_real_escape_string($link, $pass); 

    $insert = "INSERT INTO profiles (email, displayName, password) 
    VALUES ('$email', '$displayName', md5('$pass'))"; 
    mysqli_query($link, $insert) 
    or die(mysqli_error($link)); 

ma ottengo questo errore: Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino a '! "#! # ^!" #! " #!" #^'' '' '' at line 1

Se l'utente inserisce: '**! "#! # ^!" #! "* #!" # ^' '' '

+3

'mysql_ *' le funtions stanno per essere deprecate. Usa [PDO] (http://php.net/manual/en/book.pdo.php) o [MySqli] (http://php.net/manual/en/book.mysqli.php). – Lion

risposta

6

Il modo migliore è di non scappare affatto dalla stringa, ma utilizzare invece un parametro query, che fa per te dietro le quinte.

+0

E come si fa una query con parametri? –

+0

Query parametrizzata con [PDO] (http://php.net/manual/en/book.pdo.php). – Lion

+0

... usando mySQL. –

6

Utilizzando mysql_real_escape_string così funzionerà, ma è necessario:

  • Aggiungere le virgolette intorno al valore.
  • Utilizzare il risultato $newStr, non il valore originale $str.
  • Modificare il tablename in un nome che non è una parola chiave riservata.
  • Aggiungi parentesi intorno all'elenco delle colonne.

Prova questo:

$query = "INSERT INTO yourtable (username) VALUES ('$newStr')"; 

Suggerisco inoltre di controllare il risultato di mysql_query($query) e se c'è un errore, è possibile esaminare il messaggio di errore:

if (!mysql_query($query)) 
{ 
    trigger_error(mysql_error()); 
} 

Si dovrebbe anche considera l'utilizzo di una delle interfacce più recenti per MySQL. Le vecchie funzioni mysql_* sono deprecated e non devono essere utilizzate nel nuovo codice.

+0

'table' era effettivamente ok in quanto rappresenta il nome della tabella ... (' username' è il nome del campo) – Shomz

+0

Grazie per il commento. L'ho aggiunto all'elenco delle cose che devono essere corrette in quella riga di codice. –

+0

Bel lavoro, non posso darti un altro +1 :) – Shomz