Мой логин не будет работать

Я могу зарегистрировать пользователя, но когда я пытаюсь войти в систему, у меня возникают 2 проблемы:

1: Я МОГУ войти в систему, используя имя пользователя, но я также могу ввести все, что захочу, в разделе ввода пароля, и я все равно войду в систему (он не проверяет реальный пароль в базе данных)

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

Я думаю, что проблема заключается в моем $query select FROM members бла бла … но я не уверен.
Извините за то, что такой нуб.

Это регистр.php

<form method="post"  action="">

<input type="text" name="username" placeholder="USERNAME">

<input type="password" name="password1" placeholder="PASSWORD">

<input type="password" name="password2" placeholder="CONFIRM PASSWORD">

<input type="text" name="email" placeholder="E-MAIL">

<input type="date" name="age" id="age" ><input type="radio" value="male" name="gender" checked>
<input type="radio" value="female" name="gender"><input type="submit" value="SIGN UP" name="create_member">
</form><?php

require_once ("core/connect.php");

if(isset($_POST['create_member']))
{
$username = mysqli_real_escape_string($dbc, trim ($_POST['username']));
$password1 = mysqli_real_escape_string($dbc, trim ($_POST['password1']));
$password2 = mysqli_real_escape_string($dbc, trim ($_POST['password2']));
$email = mysqli_real_escape_string($dbc, trim ($_POST['email']));
$age = mysqli_real_escape_string($dbc, trim ($_POST['age']));
$gender = mysqli_real_escape_string($dbc, trim ($_POST['gender']));

if($password1 != $password2)
{
echo 'THE TWO PASSWORDS ARE NOT THE SAME';
}

$hash = hash('sha256', $password1);

function createSalt()
{
$text = md5(uniqid(rand(), true));
return substr($text, 0, 3);
}

$salt = createSalt();
$password = hash('sha256', $salt . $hash);

if(!empty($username) && !empty($email) && !empty($password) && !empty($age) && !empty($gender))

{
$query_ind = "INSERT INTO members VALUES ('', '$username', '$password', '$email', '$age' , '$gender', '$salt', NOW())";
mysqli_query($dbc, $query_ind);

}
else
{
echo "FILL OUT THE FORM PLEASE";
}
}
?>

и это логин.php

<?php

$error_msg = '';

if (isset($_POST['member_login']))
{
// Grab the user-entered log-in data
$member_username = mysqli_real_escape_string($dbc, trim($_POST['username']));
$member_email = mysqli_real_escape_string($dbc, trim($_POST['username']));
$member_password = mysqli_real_escape_string($dbc, trim($_POST['password']));if (!empty($member_username) && !empty($member_password))
{
// Look up the username and password in the database
$query = "SELECT * FROM members WHERE member_username = '$member_username' OR member_email = '$member_email' AND member_password = '$member_password'"; // SHA('$member_password')";

$data = mysqli_query($dbc, $query);

if (mysqli_num_rows($data) == 1 )
{
// The log-in is OK so set the user ID and username session vars (and cookies), and redirect to the home page
$row = mysqli_fetch_array($data);

$_SESSION['member_id'] = $row['member_id'];
$_SESSION['member_username'] = $row['member_username'];
$_SESSION['member_email'] = $row['member_email'];

setcookie('member_id', $row['member_id'], time() + (60 * 60 * 24 * 7));    // expires in 7 days
setcookie('member_username', $row['member_username'], time() + (60 * 60 * 24 * 7));  // expires in 7 days
setcookie('member_email', $row['member_email'], time() + (60 * 60 * 24 * 7));  // expires in 7 days

header('Location: ' . $_SERVER['PHP_SELF'] . '?page=mlog_in');}
else
{
// The username/password are incorrect so set an error message
$error_msg = ' INCORRECT INFOMATION, TRY AGAIN. ';
}
}
else
{
// The username/password weren't entered so set an error message
$error_msg = ' INCORRECT INFOMATION, TRY AGAIN. ';
}
}

mysqli_close($dbc);

if(!isset($_SESSION['member_id']))
{
?>
<div class="sixteen columns">
<h2>LOGIN</h2>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post" class="sixteen columns">

<input required type="text" name="username" placeholder="USERNAME / E-MAIL"/>
<input required type="password" name="password" placeholder="PASSWORD" />

<input required type="submit" name="member_login" value="LOGIN" />

<input type="checkbox" name="remember" value="1"><span>REMEMBER ME</span>

<?php
echo '<p>' . $error_msg . '</p>';
?>

<?php
echo '<a href="index.php?page=register" title="CLICK TO SIGN UP">MAKE A PROFILE</a>';
?></form>
</div>

<?php
}else
{
$profile = '';
if(isset($_GET['profile']))
{
$profile = $_GET['profile'];
}

?><?php
switch($profile)
{

default :
require_once 'profile/userpage.php';
break;

}
}

?>

0

Решение

Есть две проблемы с вашим логином. Оба относятся к вашему SELECT, но по разным причинам.

Во-первых, логические операторы AND и OR — это просто операторы. Как и математические операторы, они имеют порядок операций.
Таким же образом, как вы делаете умножение перед сложением, вы делаете И до ИЛИ.

Теперь давайте подробнее рассмотрим ваш SELECT, заменив несколько переменных для ясности.

WHERE username=$username OR email=$email AND password=$password

Если мы следуем порядку операций, это значит, что «email = $ email AND password = $ password» будет оцениваться первым. Если они пытаются войти, используя имя пользователя, это всегда будет ложным, потому что имя пользователя не равно электронной почте. Новое уравнение выглядит так:

WHERE username=$username OR false

Поскольку они пытаются войти в систему, используя имя пользователя, первая часть выражения будет иметь значение true, что означает, что все выражение будет иметь значение true. Вот почему, когда вы пытаетесь войти с именем пользователя, не имеет значения, какой пароль вы используете.

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

Надеюсь, это прояснит.

1

Другие решения

Ваш SQL-запрос совпадает либо member_username = '$member_username' или же member_email = '$member_email' AND member_password = '$member_password'
Попробуйте изменить это на

SELECT *
FROM members
WHERE member_password = '$member_password'
AND (member_username = '$member_username' OR member_email = '$member_email');

Увидеть Приоритет оператора в Mysql для дополнительной информации.

0

По вопросам рекламы [email protected]