используя php для входа из разных таблиц

0

Добрый вечер, я просто пробую что-то новое (по крайней мере, мне) о том, как входить в систему из разных таблиц. В таблице 1 есть cand_id (имя пользователя), в то время как Table2 имеет pincode (пароль). Сервер не обнаруживает ошибок при попытке входа в систему, но не работает. Мой код ниже:

if (isset($_POST['cand_id'])) {
    //escapes special characters in a string
    $cand_id = mysqli_real_escape_string($con,$cand_id);
    $pincode = mysqli_real_escape_string($con,$pincode);

    //Checking is user existing in the database or not
    $query = "SELECT cand_id 
              FROM candidates 
              WHERE cand_id='$cand_id' 
              UNION 
              SELECT pincode 
              FROM cand_login 
              WHERE pincode='$pincode'";
    $result = mysqli_query($con,$query) or die(mysql_error());
    $rows = mysqli_num_rows($result);

    if($rows==1) {
        $_SESSION['cand_id'] = $cand_id;
        // Redirect user to index.php
        header("Location: home.php");
    } else {
        echo "<div class='form'>
              <h3>cand_id/pincode is incorrect.</h3>
              <br/>Click here to <a href='log.php'>Login</a></div>";
    }
} else {
}

Что мне нужно для выполнения этой работы?

  • 0
    Теперь я вижу синтаксическую ошибку. Не уверен насчет «без ошибок» ... } }else{
  • 0
    Мне нужно скопировать / вставить SQL-инъекцию / mysql_ винт ... Кто-нибудь?
Показать ещё 9 комментариев
Теги:

1 ответ

3
Лучший ответ

Здесь много чего не так.

  • SQL-инъекция. См. Комментарий выше. Не полагайтесь на функции real_escape_string() чтобы предотвратить SQL-инъекцию, но их недостаточно.
  • Вы делаете UNION, который обычно возвращает две строки, но вы явно проверяете одну строку. Если вы измените код, чтобы проверить наличие двух строк, у вас еще большие проблемы:
    • Поскольку вы тянете любую строку, которая соответствует идентификатору пользователя, а затем любую строку, которая соответствует PIN-коду, это позволит любому пользователю войти в систему с любым PIN-кодом.
    • UNION удаляет дубликаты. Это означает, что если у пользователя есть тот же PIN-код, что и их идентификатор пользователя, запрос будет уменьшен до одной строки, и логин завершится ошибкой.
    • Если вы используете UNION ALL для удаления дубликатов, тогда потенциально вы получите более одной строки, если у людей есть один и тот же PIN-код. Т.е., как только кто-то создаст ПИН-код, который есть у кого-то другого, тогда никто с этим ПИНом не сможет войти в систему.
  • Вам нужно либо ПРИСОЕДИНЯЙТЕСЬ к таблицам, либо использовать предложение WHERE в таблице cand_login, чтобы убедиться, что выбранные вами строки относятся только к одному пользователю, который входит в систему. Прямо сейчас вы спрашиваете: "Этот пользователь существует и делает это? PIN-код существует? " Вам нужно спросить: "Этот пользователь существует и соответствует ли этот PIN-код пользователя тому, что мне дано?"
  • 0
    Благодарю. идея состоит в том, что любой комбинации, которая соответствует доступной записи в таблицах, должно быть достаточно для входа пользователей в систему.
  • 0
    Это не то, что делает этот SQL-запрос. Вставьте ерунду для pincode вы все равно получите cand_id если cand_id существует.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню