2011-09-01 5 views
6

J'utilise le script suivant qui prend les données d'un formulaire html et stocke dans une base de données Postgres. Il y a cette fonction pg_escape_string qui stocke la valeur du formulaire dans la variable php. En cherchant sur le Web, j'ai découvert que pg_escape_string échappe à une chaîne pour l'insérer dans la base de données. Je ne suis pas très clair à ce sujet. Qu'est-ce qu'il échappe réellement? Qu'est-ce qui se passe réellement quand il est dit qu'une chaîne est échappée?Que fait exactement pg_escape_string?

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

Répondre

1

pg_escape_string() empêchent sql injection dans votre code

+0

Ceci est vraiment ancien, mais pour quiconque rencontre cela plus tard, pg_escape_string() est une défense contre l'injection SQL, mais ne l'empêche pas. Utiliser des instructions préparées est préférable. (http://stackoverflow.com/questions/732561/why-is-using-a-mysql-prepared-statement-more-secure-than-using-the-common-escape) – pandubear

5

Consultez le code suivant:

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

Supposons maintenant que $name est "Chicago O'Hare". Lorsque vous faites l'interpolation de chaîne, vous obtenez ce code SQL:

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

qui est mal formé, parce que le apostrophe est interprétée comme une guillemet SQL, et votre requête d'erreur.

Worse things peut également se produire. En fait, l'injection SQL a été classée #1 Most Dangerous Software Error of 2011 par MITRE.

Mais vous ne devriez jamais créer de requêtes SQL en utilisant l'interpolation de chaîne de toute façon. Utilisez queries with parameters à la place.

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

Merci beaucoup pour l'explication claire:) –

+0

Qu'est-ce que cela fait exactement est de changer "Chicago O'Hare" à "Chicago O'Hare" (exactement comment il est échappé dépend de vos paramètres de base de données) – dsas