3

非推奨のmysql_*関数の使用を停止した後、mysqliに切り替えました。しかし、その後、プリペアドされていないステートメントはSQLインジェクションに対して安全ではないことに気づきました。その後、コードを再度変更しました。

私が持っていたのは、変数$ IDがデータベースに存在するかどうかをチェックし、その行のタイトルの値を出力する次の関数でした。

function showPostTitle($ID, $mysqli) {
    $result = $mysqli -> query("SELECT ID, title FROM blog where ID = $ID");
    $row = $result -> fetch_array(MYSQLI_BOTH);
    echo $row['title'];
}

私はそれをこれに変更しました:

function showPostTitle($ID, $mysqli) {
    $stmt = $mysqli -> prepare("SELECT ID, title FROM blog WHERE ID = ?");
    $stmt -> bind_param("i", $ID);
    $stmt -> execute();
    $stmt -> bind_result($ID, $title);
    $stmt -> fetch();
    print_r($title);
    $stmt -> free_result();
}

私の質問は、これがプリペアドステートメントを実装する正しい方法ですか?さらに、SQLインジェクションから安全になりましたか?この質問に答えてくれる人に感謝します:)

4

2 に答える 2

4

あなたのmysqliロジックは問題ないようです。見たことがない場合に備えて、ここのPHPマニュアルにいくつかの例があります。

消費しないのになぜIDを選択するのですか?また、この場合に発生すると想定しているように、完全な結果セットで1行のみが返される場合は、結果をバインドする必要はありません(IDはテーブル内の一意のインデックスです)。代わりにget_resultを使用してください。

mysqli prepareを使用すると、すべての一般的なインジェクション攻撃から保護されますが、まだドライバーに到達していないゼロデイスタイルのものは保護されません。

于 2013-01-07T16:45:35.400 に答える
1

この投稿を見てください:

PDOのプリペアドステートメントはSQLインジェクションを防ぐのに十分ですか?

MySQLiの代わりにPDOを使用しており、プリペアドステートメントを作成することで同じ問題を解決しています。

あなたの質問に答えなかったことをお詫びしますが、あなたが検討するためのリソースを提供したかっただけです。

于 2013-01-07T16:16:43.830 に答える