Запретить пользователям иметь одинаковое имя пользователя - PullRequest
0 голосов
/ 24 сентября 2011

Я только что обнаружил довольно серьезную уязвимость в моем коде во время некоторого тестирования,

В основном, если мое имя пользователя было «admin», а пароль - «12345» ... и пользователь присоединился и выбралимя «Администратор» и тот же пароль «12345», когда он / она входит в систему, они будут в моей учетной записи на сайте. Как вы можете себе представить, я создал целый недостаток, поскольку это затронет каждого потенциального пользователя на сайте.

Итак, мой вопрос в том, что я могу изменить в этом операторе, чтобы он проверял совпадение EXACT.

   WHERE login_name ='$user' AND user_password ='$pass' LIMIT 1";  

Вот файл login_process.php

    <?php
    require_once("includes/session.php");
    $connection = mysql_connect("localhost", "user", "password");
    if(!$connection)
    {
        die("Database connection failed: " . mysql_error());
    }
    $db_select = mysql_select_db("game", $connection);
    if(!$db_select)
    {
        die("Database selection failed: " . mysql_error());
    }
    $user = mysql_real_escape_string($_POST['username']);
    $pass = mysql_real_escape_string($_POST['password']);
    $pass = sha1($pass);

    // Need to make a change to the below query, as it doesn't match for case sensitivity.

    $query = "SELECT user_id, user_name, user_level FROM users WHERE login_name ='$user' AND user_password ='$pass' LIMIT 1";
    $result=mysql_query($query);
    if(mysql_num_rows($result) == 1)
    {
        $found_user = mysql_fetch_array($result);
        $_SESSION['user_id'] = $found_user['user_id'];
        $_SESSION['user_name'] = $found_user['user_name'];
        $_SESSION['user_level'] = $found_user['user_level'];
        header("Location: index.php");
    }
    else 
    {
        echo "The username or password you entered was incorrect. <br/> Please click <a href='login.php'>Here</a> to try again.";
    }
    ?>

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011

сортировка базы данных по умолчанию без учета регистра. поэтому пользователь admin и Admin или adMin одинаковы. При создании пользователя проверьте базу данных, существует ли такое же имя пользователя или нет.

похоже, что вы используете сортировку с учетом регистра .. вы можете использовать сортировку без учета регистра для этой пользовательской таблицы, чтобы ваш запрос работал нормально.

или

при создании пользователя и проверке базы данных на наличие дублирующихся записей используйте LCASE функцию следующим образом

SELECT * FROM USERS WHERE LCASE(username) = 'admin'
0 голосов
/ 24 сентября 2011

У вас должно быть уникальное ограничение на столбец login_name:

alter table users add constraint unique (login_name)

Это должно заботиться о любых добавляемых новых записях, которые отличаются только от существующих записей в каждом конкретном случае (при условии, конечно, что вы используете сортировки без учета регистра по умолчанию ). Если вы получаете жалобы, как

ОШИБКА 1062 (23000): повторяющаяся запись «XXX» для ключа «login_name»

тогда у вас уже есть дубликаты, и вам нужно будет их очистить, прежде чем добавлять свое УНИКАЛЬНОЕ ограничение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...