2011-09-01 43 views
6

Estoy usando la siguiente secuencia de comandos que toma los datos de un formulario html y los almacena en una base de datos de Postgres. Existe esta función pg_escape_string que almacena el valor del formulario en la variable php. Al buscar en la web, encontré que pg_escape_string escapa de una cadena para insertarla en la base de datos. No estoy muy claro en esto. ¿Qué es lo que realmente escapa? ¿Qué sucede realmente cuando dice que se ha escapado una cuerda?¿Qué hace pg_escape_string exactamente?

<html> 
    <head></head> 
    <body>  

<?php 
if ($_POST['submit']) { 
    // attempt a connection 
    $dbh = pg_connect("host=localhost dbname=test user=postgres"); 
    if (!$dbh) { 
     die("Error in connection: " . pg_last_error()); 
    } 

    // escape strings in input data 
    $code = pg_escape_string($_POST['ccode']); 
    $name = pg_escape_string($_POST['cname']); 

    // execute query 
    $sql = "INSERT INTO Countries (CountryID, CountryName) VALUES('$code', '$name')"; 
    $result = pg_query($dbh, $sql); 
    if (!$result) { 
     die("Error in SQL query: " . pg_last_error()); 
    } 

    echo "Data successfully inserted!"; 

    // free memory 
    pg_free_result($result); 

    // close connection 
    pg_close($dbh); 
} 
?>  

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
     Country code: <br> <input type="text" name="ccode" size="2"> 
     <p> 
     Country name: <br> <input type="text" name="cname">  
     <p> 
     <input type="submit" name="submit"> 
    </form> 

    </body> 
</html> 

Respuesta

1

pg_escape_string() evitar sql injection en el código

+0

Esto es muy viejo, pero para cualquiera que se encuentre con esto más adelante, pg_escape_string() es una defensa contra la inyección de SQL, pero no lo impide. Usar declaraciones preparadas es mejor. (http://stackoverflow.com/questions/732561/why-is-using-a-mysql-prepared-statement-more-secure-than-using-the-common-escape) – pandubear

5

considere el siguiente código:

$sql = "INSERT INTO airports (name) VALUES ('$name')"; 

Supongamos ahora que es $name"Chicago O'Hare". Cuando usted hace la interpolación de cadenas, se obtiene el código SQL:

INSERT INTO airports (name) VALUES ('Chicago O'Hare') 

que se forma mal, porque el apóstrofe se interpreta como un símbolo de comillas SQL, y la consulta será error.

Worse things puede pasar, también. De hecho, la inyección SQL fue clasificada #1 Most Dangerous Software Error of 2011 por MITRE.

Pero nunca se deben crear consultas SQL utilizando la interpolación de cadenas de todos modos. Use queries with parameters en su lugar.

$sql = 'INSERT INTO airports (name) VALUES ($1)'; 
$result = pg_query_params($db, $sql, array("Chicago O'Hare")); 
+0

Muchas gracias por la clara explicación:) –

+0

Lo que hace exactamente es cambiar 'Chicago O'Hare' a 'Chicago O''Hare' (exactamente cómo se escapó depende de la configuración de su base de datos) – dsas

Cuestiones relacionadas