1

私は準備された挿入ステートメントを数年間使用しており、パラメーターを適切にバインドしているか、エラーが発生すると想定していましたが、次のphpがエラーなしでレコードをバインドおよび挿入するのではなく、intである必要がある文字列をゼロに変更するようには見えません. したがって、SQL インジェクション攻撃を防ぐには問題ないかもしれませんが、テーブルに偽のレコードが作成されることになります。例えば:

    $q = "INSERT INTO `table` (id1, id2) VALUES (?, ?)";
    $stmt = mysqli_stmt_init($dbc);
    $stmt->prepare($q);
    $id1 = 'aaaaaaa';
    $id2= 'aaaaaaa';
    $result = $stmt->bind_param('ii', $id1, $id2);
    echo '<p>' . $result . '</p>'; // Trying to bind a string to an int returns true! 
    echo $dbc->error; // nothing
    $stmt->execute(); // inserts record changing $id2 to zero but auto-increments primary key $id1
    echo $dbc->error; // nothing

これは、Apache/2.2.14、PHP/5.3.1、および MySQL 5.1.41 を使用する Xampp 環境で実行されています。誰が何が起こっているのか教えてもらえますか?

4

2 に答える 2

0

私は確かに専門家ではありませんが、一見してください。あなたが持っている:

$id1 = 'aaaaaaa';
$id2= 'aaaaaaa';
$result = $stmt->bind_param('ii', $id1, $id2);

パラメータは'ii'、整数をバインドすることを示しています! 実際、あなたの$id1$id2は文字列です。文字列の場合は、次を使用する必要があります。

$result = $stmt->bind_param('ss', $id1, $id2);
于 2014-01-09T09:24:04.763 に答える
0

$stmt->bind_param() は、指定された変数の特定の型をチェックせず、指定された型に変換するだけです。そして、文字列 'aaaaaaa' は int-value: 0 に変換されます。これが php のやり方です。

変数に有用な/正しい値が含まれている場合、データベース挿入ステートメントはチェックする場所が間違っています。検証が機能する場合は、前にそれを行い、それらを挿入するだけにしてください。

int の検証を行うには、php 関数 is_numeric() または is_int() を使用できます。

于 2014-01-09T09:35:02.553 に答える