0

私は何度も読みました-そして明確にしたいだけです(私は混乱していると思います)

今日、mysqli に切り替えて、準備済みステートメントを使い始めました。

私の準備されたステートメントの例

function read($table, $var) {
    if($stmt = mysqli_prepare($link, "SELECT * FROM ? WHERE `uid`=?")) {
        mysqli_stmt_bind_param($stmt, "si", $table, $var);
        mysqli_stmt_execute($stmt);
        return mysqli_fetch_assoc($stmt);
    } else {
        echo '<script type="text/javascript>">alert("Something went wrong");</script>';
    }
}

$info = read("users", $_SESSION['uid']);
$char = read("characters", $_SESSION['uid']);

まだ何かをエスケープする必要がありますか? 私は知っています、私は知っています、準備されたステートメントを使用するときにエスケープする必要がないことをどこでも読んだことがありますが、を心配させるこのような質問があります。

4

2 に答える 2

4

クエリの唯一の問題は、tableName をパラメーターとして渡すことができないことです。パラメータ化できるのは値のみです。もう 1 つの方法は、クエリと一緒に tableName を連結することです。

"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?"
于 2012-12-27T04:47:35.177 に答える
-1

まず第一に、このコードは機能しません。

だから、実際には2つの質問があります

  1. バインドされたパラメーターで追加のエスケープを行う必要がありますか?

いいえ。

  1. 識別子をクエリに安全に挿入する方法は?

場合によります。コードにテーブル名がハードコードされている限り、そのまま挿入しても問題ありません。
ただし、信頼できないソースからのものである場合は、ホワイトリストを使用してフィルターで除外する必要があります。他の回答で説明しましたhttps://stackoverflow.com/a/8255054/285587

あなたがリンクした質問に関しては、2番目のものは無関係で、最初のものはほとんど意味がありません. LIKE は多くの行を返すことになっているため、LIKE をまったく使用しないか、(安全性の観点から) 心配しないでください。正しい結果を返すという点では、LIKE で特別な意味を持つ文字をエスケープしたい場合がありますが、検索目的で LIKE を使用することはまったくありません。

于 2012-12-27T05:03:07.717 に答える