-1

次のように、準備されたステートメントを使用することと、変数を文字列にエスケープ/変換することの違いを理解しようとしています。

$sql = "SELECT `user_id`, `user_name` FROM table WHERE `user_id` = ? and `user_name`= ?";
$sqlPrepare = $conn->prepare($sql);
$sqlPrepare->bind_param('ss', $user_id, $user_name);
$sqlPrepare->execute();
$result = $ $sqlPrepare->get_result();
            if($result->num_rows ===0)
                         {
                        // Do work
                         }

VS

mysqli::real_escape_string($whatever_vars_needed);

$sql = "SELECT `user_id`, `user_name` FROM table WHERE `user_id` = '".$user_id."' and `user_name`= '".$user_name."'";
$sqlQuery = $conn->query($sql);
    if($sqlQuery->num_rows ===0)
                         {
                        // Do work
                         }

SQL インジェクションに対する保護に関する限り、どちらも同じ目的を果たしますか? もしそうなら、余分な入力を少し節約できるので、2 番目の方法を使用することをお勧めしませんか?

クエリと準備を使用していることに気づきましたが、それでも変数を文字列に変換している場合、違いはわかりませんか?

より良い方法はどれですか?

4

1 に答える 1

3

余分な入力を少し節約できるため

これは、PHP サブカルチャーの非常に興味深い現象です。
何らかの理由で、通常の PHP ユーザーは、ユーザー定義関数やその他の複雑なコントロールやデータ構造について何も知りません。したがって、「タイピングを少し節約する」という彼らの唯一の考えは、安全対策やエラー報告などの「不要な」操作を取り除くことです。

タグをブラウズすると、何千もの短縮形を見つけることができます。中には非常にスマートなものもありますが、何らかの理由でユーザー定義関数を含むものはなく、生の PHP 関数のみです。

于 2013-10-06T20:57:09.810 に答える