2012-07-13 17 views
8

Possible Duplicate:
Best way to prevent SQL Injection in PHPPHP/MySQL - Mejor uso y práctica de cuerdas que escapan

¿Cuál es la mejor manera de escapar de las cadenas de la hora de hacer una consulta? mysql_real_escape_string() parece bueno, pero no sé exactamente cómo usarlo correctamente.

¿Este código hace el trabajo correctamente?

<?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:

Ahora tengo este código:

 $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)); 

pero me sale este error: Usted tiene un error en su sintaxis SQL; compruebe el manual que corresponde a su versión del servidor MySQL para el sintaxis derecho al uso cerca de '! "#! # ^!" #! " #!" #^'' '' '' en la línea 1

Si el usuario entra: '**! "#! # ^!" #! "* #!" # ^' '' '

+3

'mysql_ *' las funciones están a punto de ser obsoletas. Utilice [PDO] (http://php.net/manual/en/book.pdo.php) o [MySqli] (http://php.net/manual/en/book.mysqli.php). – Lion

Respuesta

6

La mejor manera es no escapar de la cadena, sino usar un parámetro consulta, que lo hace por usted detrás de las escenas.

+0

¿Y cómo se hace una consulta parametrizada? –

+0

Consulta parametrizada usando [PDO] (http://php.net/manual/en/book.pdo.php). – Lion

+0

... usando mySQL. –

6

Usando mysql_real_escape_string como que funcione, pero hay que:

  • añaden las citas en torno al valor.
  • Utilice el resultado $newStr, no el valor original $str.
  • Cambie el nombre de la tabla a un nombre que no sea una palabra clave reservada.
  • Agregue paréntesis alrededor de la lista de columnas.

Prueba esto:

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

También sugiero que compruebe el resultado de mysql_query($query) y si hay un error, se puede examinar el mensaje de error:

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

También debe considere usar una de las interfaces más nuevas de MySQL. Las funciones antiguas mysql_* son deprecated y no se deben usar en el nuevo código.

+0

'table' estaba realmente bien, ya que representa el nombre de la tabla ... (' username' es el nombre del campo) – Shomz

+0

Gracias por el comentario. Lo he agregado a la lista de cosas que deben corregirse en esa línea de código. –

+0

Buen trabajo, no puedo darle otro +1 :) – Shomz