У меня проблемы со входом в мою базу данных с использованием метода blowfish (проблема в том, что он не обнаруживает неправильный пароль).
<?php
if(isset($_POST['signin'])){
global $connection;
$username = $_POST['username'];
$safe_username = mysql_real_escape_string($connection, $username);
$password = $_POST['password'];
if (empty($username) or empty($password))
{
header("location: error.php");
} else {
$query = "SELECT * FROM users WHERE username = '{$safe_username}'";
$result = mysql_query($connection, $query);
if($rows = mysql_fetch_assoc($result)){
$set_password = $rows['password'];
$input_password = crypt($password, $set_password);
}
if ($input_password == $set_password) {
header("location: ../pages/profile.php"); // Redirecting To Other Page
} else {
header ("location: wrong-error.php");
}
}
}
}
?>
пожалуйста помоги ;(
Если вы используете PHP 5.5+
Вы можете воспользоваться новыми функциями паролей:
Это значительно упрощает процесс. Он также обратно совместим с crypt()
если вы используете PASSWORD_BCRYPT
Алго в функции params.
Хотя это может помочь, это может не решить вашу проблему, если это SQL. Пожалуйста, поделитесь любыми ошибками. Вы можете получить последний mysql
ошибка через mysql_error
функция:
http://php.net/manual/en/function.mysql-error.php
Также рассмотрите возможность использования библиотеки для ваших операций SQL и / или обновления до mysqli
,
http://php.net/manual/en/mysqli.overview.php
Кроме того, на какие ошибки уже указывали другие:
if($rows = mysql_fetch_assoc($result)){
$set_password = $rows['password'];
$input_password = crypt($password, $set_password);
}
if ($input_password == $set_password) {
header("location: ../pages/profile.php"); // Redirecting To Other Page
Представьте, что здесь происходит, если mysql_fetch_assoc
возвращается false
…? (Например, потому что запрос был синтаксически неверен или просто возвратил пустой набор результатов.)
ни $set_password
ни $input_password
будет инициализирован с любым значением на всех, а затем на следующем if
утверждение, что они просто неопределенные переменные — и сравнение «значений» этих двух на равенство приведет к true
,
Прежде всего, установите для своего PHP error_reporting значение, подходящее для разработки, — тогда, по крайней мере, PHP получит шанс рассказать вам об ошибке, подобной этой. (Если вы не знаете, что это значит, изучите это, пожалуйста.)
А затем прочитайте о том, как осуществляется разумная обработка ошибок, когда вы делаете запросы к базе данных с помощью PHP.
И, между прочим, все ваши заголовки Location неправильно а также — Location
заголовок требует абсолютный URL по определению.
Оценка:
<?php
if(isset($_POST['signin'])){
global $connection;
Не используйте глобалы. Это плохая практика. Если вам нужно значение соединения, лучше использовать include
заявление, которое возвращает $connection
переменная.
$username = $_POST['username'];
$safe_username = mysql_real_escape_string($connection, $username);
$password = $_POST['password'];
if (empty($username) or empty($password))
{
header("location: error.php");
headers
должен всегда сопровождаться немедленно exit
/die
заявление, чтобы остановить остальную часть кода, выполняемого, прежде чем сценарий перемещается, чтобы сосредоточиться на новом местоположении.
Кроме того, какой смысл в установке значения имени пользователя POST real_escape_string в качестве нового значения, собираетесь ли вы повторно использовать неэкранированный значение?
} else {
$query = "SELECT * FROM users WHERE username = '{$safe_username}'";
Не выбирай *
это неразумно и относительно дорого для MySQL, лучше выбрать нужные значения, в этом случае вы, похоже, используете только поле «пароль». Так Select password FROM...
Также хорошая практика, чтобы добавить LIMIT 1
к SQL, так как вы всегда будете искать только одно имя пользователя.
$result = mysql_query($connection, $query);
Эта строка является основной причиной вашей проблемы, у вас есть макет, как будто вы используете mysqli, но вы кодируете в стандартном mysql. Mysql это осуждается и больше не должен использоваться, вместо этого используйте MySQLi, который имеет ту же структуру, что и у вас выше, но все еще поддерживается и имеет множество исправлений безопасности и других преимуществ для MySQL. Пожалуйста, используйте это.
В этом случае строка выше не будет выполняться и вернет ошибку
или иначе FALSE, поэтому строка ниже никогда не будет выполнена для TRUE
:
if($rows = mysql_fetch_assoc($result)){
Этот ряд может быть работать (учитывая, что данные значения действительны) как if
но чаще while
заявление. Заменить If для While
,
$set_password = $rows['password'];
$input_password = crypt($password, $set_password);
Ваше криптовое утверждение неверно, синтаксис crypt
является crypt($txt, $salt)
но вы ввели пароль дважды. Это нонсенс. Если у вас PHP 5.3+, вы можете использовать встроенные функции password_ из ядра PHP.
увидеть http://php.net/manual/en/ref.password.php
}
if ($input_password == $set_password) {
Они могут быть равны, но то, что вы сравниваете, может также быть неустановленным / NULL, ваше приведенное выше выражение crypt является бессмысленным, так что оба будут давать неверные результаты. Это основная причина вашей проблемы.
Также в вашем вопросе, что если $_POST['password']
пусто, тогда ваш первый заголовок запущен, но тогда, потому что вы не сделали die
после первого определения заголовка код продолжает выполняться, а затем находит этот оператор заголовка (потому что if(NULL == NULL)
=== true) и поэтому этот заголовок заменяет первый заголовок, и именно поэтому вы вошли в систему, даже если ваши данные пусты.
header("location: ../pages/profile.php"); // Redirecting To Other Page
Снова добавьте exit
Вот. Также лучше использовать абсолютный адрес, такой как $_SERVER['HTTP_HOST']."/pages/profile.php"
,
} else {
header ("location: wrong-error.php");
}
}
}
}
?>
У вас также есть два слишком много закрывающих скобок в вашем коде.
Кроме того, правильно используйте ошибку PHP, на которую ссылается CBroe, это мудрые слова его.
Я повторяю, используйте MySQLi. Журнал ошибок с настройками ошибок PHP. Обе эти детали легко доступны из переполнения стека. Также действительно, действительно изучите использование функций паролей PHP, а не Crypt напрямую, потому что в данный момент вы делаете это неправильно.
У вас странная логика здесь:
if($rows = mysql_fetch_assoc($result)){
$set_password = $rows['password'];
$input_password = crypt($password, $set_password); <-- This is weird
}
if ($input_password == $set_password) {
Когда ты crypt
2-й параметр поваренная соль. Соль должна быть какой-то постоянной. Но вы просто получите это от $rows
,
Если вы можете разместить свой код, где вы делаете свой INSERT
чтобы увидеть, какой поваренная соль был использован во время вставки, вы можете изменить свою строку на что-то вроде:
$input_password = crypt($password, $constant_salt_from_insert);