0

ユーザーが持つ特権を判断するために 2 つの異なるテーブルをチェックするコードを書いています。コードは次のようになります。

    $query1 = ("SELECT 1 FROM `customers` WHERE `Email` = '$email' AND `Password` = '$password'");
    $query2 = ("SELECT 1 FROM `admins` WHERE `Email` = '$email' AND `Password` = '$password'");

    $result1 = mysql_query($query1) or die(mysql_error());
    $result2 = mysql_query($query2) or die(mysql_error());

    if (mysql_num_rows($result1) == 1) {
        // Log user in as a Customer
        exit;
    } else if (mysql_num_rows($result2) == 1) {
        // Log user in as an Admin.
        exit;
    } else {
        // Direct user to registration page.
    }

誰でもこれを見て、このようにすることでセキュリティ上のリスクがあるかどうか教えてもらえますか? よろしくお願いします。

4

3 に答える 3

0

ここでの大きな問題の 1 つは、コードが SQL インジェクションに対して脆弱であることです。これは基本的に、ユーザーがメールまたはパスワードのフォームにコードを入力して、ここでのチェックをバイパスできることを意味します。

まず、クエリで使用する前に、入力に対して次のことを実行します。

$email = mysql_real_escape_string($email);
$password = mysql_real_escape_string($password);

ただし、mysql ライブラリは php では推奨されていません。むしろ、ここで pdo の準備済みステートメントについて読んでください: http://www.php.net/manual/en/ref.pdo-mysql.php

ただし、mysql_real_escape_string を試して、SQL インジェクションに対する最初のセキュリティ対策を講じることができます。

于 2012-08-29T23:29:26.480 に答える
0

まず、あなたのコードはあなただけが知っているという変更があります。

次に、入力データを確認する必要があります。メールとパスワードの領域は安全ではありません。SQL インジェクションを防止する必要があります。そうしないと、コードは安全ではありません。

ところで、管理者向けに IP 制限ログインを提供しています。私はこれを使用しています。そして、より安全です。

于 2012-08-29T23:29:16.500 に答える
0

たとえば、私のパスワードが

OR 1=1

アクセスします。mysql 準備済みステートメントを使用する

<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("SELECT 1 FROM customers WHERE Email = (?) AND Password = (?)"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->bind_param("ss", $email, $password)) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
?>
于 2012-08-29T23:27:01.573 に答える