2011-01-20 9 views
6

次のコードを入力すると、$cityをエスケープしてサニタイズする必要がありますか?準備されたPHP/MySQLクエリを使用する場合、入力をサニタイズする必要がありますか?

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

準備クエリを使用するときに入力をサニタイズする必要がありますか?

答えて

9

いいえ、あなたはそれをエスケープする必要はなく、注入保護のために消毒する必要はありません。他のアプリの特定のものについては、あなたはそれを念入りにするかもしれません。

私はしばらく前に同様の質問だった:

mysqli_stmt_bind_param SQL Injection

8

@Gary: あなたがまっすぐにmysqliの程度php.netのマニュアルからのコードの断片は::準備というコピーを。その同じページに次のテキストがあります:

"準備文の目的は、SQL文にデータを含めることではなく、SQLステートメントにインクルードすることは安全ではありません。コードを読みやすく)、SQLインジェクションが起こりにくい」

あなたの質問に対する答えはどれですか;

+4

木は木の道に入りました。 ;) –

+0

はい、しかし準備された文は、アプリケーション層とデータ層の両方で多くのリソースを必要とすることがあります。 – Jmoney38

+0

@ Jmoney38 Spot on、私はすべての解決策は、それが一般的な行為であると思われるので、ちょうどそれを選ぶのではなく、慎重に考えるべきだと思います。 – Sander

1

さらに、加えて。

準備されたステートメントを正しく使用すると、SQLインジェクションの惨事をほぼ完全に軽減します。それにもかかわらず、入力データをフォーマット/サニタイズする必要があります。クリーニング入力はセキュリティ機能ではありませんが、堅牢性と使いやすさのためにはお勧めです。エスケープデータベースまたはプリペアドステートメントを置き換えるものではありませんが、で動作するようにコヒーレントデータを保証します。

$city = trim(preg_replace("/[^\w-]+/", " ", $city)); 

どの再び:あなたの$市のケースでは、すべての非単語文字を取り除くしたい場合があります。

+0

しかし、これはサニタイズではありません(データから不正な文字を削除します)。彼らは2つの異なるものです。準備されたステートメントでもデータを常に検証する必要があります。 – viery365

0

私はこの質問が非常に古いことを実感します。私は同じ情報を自分自身で探している間にそれを見つけました。私はサンダーの答えにコメントしたいと思いますが、私はまだコメントするほどの評判はありません。

サンダーさんによると、あなたは衛生的にする必要はありませんが、http://www.w3schools.com/php/php_mysql_prepared_statements.aspにあります(そして、私はw3schoolsが常に完全で最新の情報源ではないことを認識していますが、それは賢明で簡単です注釈:外部ソースからのデータ(ユーザー入力など)を挿入する場合は、そのデータをサニタイズして検証することが非常に重要です。

したがって、フォームを使用してユーザー入力を受け入れる場合は、を削除する必要があります。

関連する問題