Отсутствует проверка пароля
Я использую приведенный ниже код, он проверяет пустые поля и проверяет электронную почту, но даже если пароль правильный, он не войдет в систему. пароль был вставлен с защитой md5, ниже приведен код.
PHP:
session_start();
//Checks if there is a login cookie
if(isset($_COOKIE['ID_my_site']))
//if there is, it logs you in and directes you to the members page
{
$email = $_COOKIE['ID_my_site'];
$pass = $_COOKIE['Key_my_site'];
$check = mysql_query("SELECT * FROM accounts WHERE email = '$email'")or die(mysql_error());
while($info = mysql_fetch_array( $check ))
{
if ($pass != $info['password'])
{
}
else
{
header("Location: home.php");
}
}
}
//if the login form is submitted
if (isset($_POST['submit'])) { // if form has been submitted
// makes sure they filled it in
if(!$_POST['email'] | !$_POST['password']) {
die('You did not fill in a required field.');
}
// checks it against the database
if (!get_magic_quotes_gpc()) {
$_POST['email'] = addslashes($_POST['email']);
}
$check = mysql_query("SELECT * FROM accounts WHERE email = '".$_POST['email']."'")or die(mysql_error());
//Gives error if user dosen't exist
$check2 = mysql_num_rows($check);
if ($check2 == 0) {
die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>');
}
while($info = mysql_fetch_array( $check ))
{
$_POST['password'] = stripslashes($_POST['password']);
$info['password'] = stripslashes($info['password']);
$_POST['password'] = md5($_POST['password']);
//gives error if the password is wrong
if ($_POST['password'] != $info['password']) {
die('Incorrect password, please try again.');
}
else
{
// if login is ok then we add a cookie
$_POST['email'] = stripslashes($_POST['email']);
$hour = time() + 3600;
setcookie(ID_my_site, $_POST['email'], $hour);
setcookie(Key_my_site, $_POST['password'], $hour);
//then redirect them to the members area
header("Location: home.php");
}
}
}
else
{
// if they are not logged in
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<table border="0">
<tr><td colspan=2><h1>Login</h1></td></tr>
<tr><td>email:</td><td>
<input type="text" name="email" maxlength="40">
</td></tr>
<tr><td>Password:</td><td>
<input type="password" name="password" maxlength="50">
</td></tr>
<tr><td colspan="2" align="right">
<input type="submit" name="submit" value="Login">
</td></tr>
</table>
</form>
}
Вот регистрационный код:
PHP:
// here we encrypt the password and add slashes if needed
$_POST['password'] = md5($_POST['password']);
if (!get_magic_quotes_gpc()) {
$_POST['password'] = mysql_escape_string($_POST['password']);
$_POST['email'] = mysql_escape_string($_POST['email']);
$_POST['full_name'] = mysql_escape_string($_POST['full_name']);
$_POST['user_url'] = mysql_escape_string($_POST['user_url']);
}
// now we insert it into the database
$insert = "INSERT INTO accounts (Uniquer, Full_name, Email, Password, User_url)
VALUES ('".$uniquer."','".$_POST['full_name']."', '".$_POST['email']."','".$_POST['password']."', '".$_POST['user_url']."')";
$add_member = mysql_query($insert);
После использования функции ini_set я получил сообщение об ошибке, получаю это сообщение, но не уверен, что оно означает:
There are the lines where the errors are at:
if ($pass != $info['password'])
и эта строка
if ($_POST['password'] != $info['password']) {
4 ответа
Я решил это, если вы заметили, что в запросах написано SELECT *, вместо этого я попытался выбрать электронную почту, пароль.
Вы пытаетесь получить доступ к полю БД с $info['password']
, но поле базы данных на самом деле Password
с большой буквы
Ты звонишь mysql_escape_string
хранить данные в БД и вызывать stripslashes
в представленной форме входа в систему. Возможно, они делают разные вещи с паролем. Еще несколько вещей для размышления:
- Если вы используете пароль MD5 для хранения его в БД, вам не нужно звонить
stripslashes
или жеmysql_escape_string
в теме. Он уже был преобразован только в буквенно-цифровые символы. mysql_escape_string
устарела.- Вместо того, чтобы экранировать поле электронной почты, вам лучше проверить его формат.
После добавления новой регистрации вручную введите md5 используемый пароль, а затем сравните это значение со значением, сохраненным в БД. Вы можете обнаружить, что они разные.
Единственное, что я вижу, это то, что вы используете stripslashes
на опубликованном пароле (не версии md5), но используйте его в версии md5 для сохраненного пароля.
Вы не должны действительно использовать stripslashes
на пароль в базе данных, так как ни один пароль не должен храниться с косой чертой для начала.
Что произойдет, если вы измените:
$_POST['password'] = stripslashes($_POST['password']);
$info['password'] = stripslashes($info['password']);
$_POST['password'] = md5($_POST['password']);
Для того, чтобы:
$_POST['password'] = md5($_POST['password']);
$_POST['password'] = stripslashes($_POST['password']);
$info['password'] = stripslashes($info['password']);
Вы задали аналогичный вопрос некоторое время назад с совершенно другим кодом, так что я предполагаю, что сейчас это больше проблема с базой данных.
Ваше поле пароля допускает 32 символа для хэша md5? Слишком короткое поле пароля усекает хэш md5, поэтому всегда происходит сбой входа в систему.