3

私は最終的に、クエリを実行するための優れた、安全で高速な方法だと思うものを作成しましたが、サイト全体に実装する前に完全に確認したいと思います.

私のコード:

$email = $_POST['email'];
$displayName = $_POST['displayName'];
$pass = $_POST['pass1'];

if($stmt = $link -> prepare("INSERT INTO profiles (email, displayName, password) VALUES (?, ?, md5(?))")) {

        /* Bind parameters
            s - string, b - boolean, i - int, etc */
        $stmt -> bind_param("sss", $email, $displayName, $pass);

        /* Execute it */
        $stmt -> execute();

        echo "You are now registered.<br />";
        echo "<a href=\"login.php\">Login</a>";


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

ところで、stmt とはどういう意味ですか?

編集、新しいコード:

    /* Create a prepared statement */

    $stmt = $link -> prepare("INSERT INTO profiles (email, displayName, password,
    dateRegistered) VALUES (?, ?, md5(?), NOW())");

    if ( false===$stmt ) {
      die('prepare() failed: ' . htmlspecialchars($link->error));
    }

    $rc = $stmt -> bind_param("sss", $email, $displayName, $pass);
    if ( false===$rc ) {
      die('bind_param() failed: ' . htmlspecialchars($stmt->error));
    }

    /* Execute it */
    $rc = $stmt->execute();
    if ( false===$rc ) {
      die('execute() failed: ' . htmlspecialchars($stmt->error));
    }

    echo "You are now registered.<br />";
    echo "<a href=\"login.php\">Login</a>";


    /* Close statement */
    $stmt -> close();
4

1 に答える 1

2

はい - これは準備済みステートメントの背後にある主な目的である SQL インジェクションのリスクをほぼ回避する準備済みステートメントです。

唯一の欠点は、動的な数のフィールドなど、さまざまなクエリを処理する必要があるユーティリティで使用すると面倒になる可能性があることです。ただし、リフレクションを使用してこれを回避できます。

ただし、いくつかのポインター:

  • パスワードの md5? おそらく最も安全なオプションではありません。暗号化ソルトの使用を検討してください(Googleで検索すると、これに関する多くのものがあります)

  • チェックやサニゼーションなしでスーパーグローバルから直接データを取得しているようですが$_POST、それはこのSOの質問のコードスニペットの長さを抑えるためだったと思います. 入力からクエリに直接挿入しないでください。検証/エスケープ/エンコーディングなどのフェーズが必要です。

  • ステートメントの実行が成功したことを確認していないようです-成功したと仮定してから、フィードバックに進みます。最初にエラーを確認してください。

于 2012-07-13T22:45:02.313 に答える