2011-09-01 11 views
6

私は、HTML形式のデータをPostgres DBに保存する次のスクリプトを使用しています。フォームからphp変数への値を格納するこのpg_escape_string関数があります。ウェブ全体を検索すると、pg_escape_stringが文字列をエスケープしてデータベースに挿入されていることがわかりました。私はこれについてあまり明確ではない。実際に何が逃げ出していますか?文字列がエスケープされていると言ったときに実際に何が起こるのですか?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> 

答えて

1
+0

これは本当に古いですが、誰もが)(pg_escape_string、この後に出くわすためにSQLインジェクションに対して1つの防衛であるが、それを防ぐことはできません。プリペアドステートメントを使う方が良いです。 (http://stackoverflow.com/questions/732561/why-is-using-a-mysql-prepared-statement-more-secure-than-using-the-common-escape) – pandubear

5

は、次のコードを考えてみましょう、あなたのコード内でsql injectionを防ぐ:今$name"Chicago O'Hare"であると仮定し

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

を。 アポストロフィSQLの引用符として解釈されているので、

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

悪い形成されており、そして、あなたのクエリがエラーになります:あなたは、文字列の補間を行うと、あなたは、このSQLコードを取得します。

Worse thingsも発生します。実際、SQLインジェクションはMITERによって#1 Most Dangerous Software Error of 2011にランクされました。

しかし、文字列補間を使用してSQLクエリを作成しないでください。代わりにqueries with parametersを使用してください。

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

ありがとう、明確な説明のために: ) –

+0

正確には、Chicago O'HareをChicago O'Hareに変更するだけです(正確にどのようにエスケープされるかは、データベースの設定によって異なります) – dsas