Я хочу сохранить введенный пароль и войти в базу данных, а затем получить его и проверить правильность ввода данных пользователя. Я, должно быть, неправильно понял что-то функциональное о функции склепа, потому что мой очень простой скрипт не работает. Вот:
<?php
header("Content-Type: text/plain");
mysql_connect('localhost','root','') or die('Cannot connect mysql server');
mysql_select_db('ChemAlive_login') or die('cannot connect database');
$user_input='test';
$mail='[email protected]';
$password = crypt($user_input);
$q=mysql_query("select * from login where mail='".$mail."' ") or die(mysql_error());
$n=mysql_fetch_row($q);
if($n>0)
{
$q=mysql_query("select password from login where mail='".$mail."' ");
$pp=mysql_fetch_row($q);
if(crypt($user_input,$pp[0])==$pp[0]) echo "ok";
else echo "wrong";
}
else
{ $insert=mysql_query("insert into login values('".$mail."','".$password."')") or die(mysql_error());
echo "insert";}
?>
При первом входе в систему вводятся логин и адрес электронной почты, а вставки "вставить" - эхо. Но на втором этапе у меня есть "неправильное" эхо, и я не понимаю, почему.
благодаря
Зачем использовать crypt, почему бы не использовать md5 или лучше еще sha1? Это означало бы переписывание кода следующим образом: sha1:
<?php
header("Content-Type: text/plain");
mysql_connect('localhost','root','') or die('Cannot connect mysql server');
mysql_select_db('ChemAlive_login') or die('cannot connect database');
$user_input='test';
$mail='[email protected]';
$password = sha1($user_input);
$q=mysql_query("select * from login where mail='".$mail."' ") or die(mysql_error());
$n=mysql_num_rows($q); //not mysql_fetch_row, as that does not return count but an array
if($n>0)
{
$q=mysql_query("select password from login where mail='".$mail."' ");
$pp=mysql_fetch_row($q);
if(sha1($user_input)==$pp[0]) {
echo "ok";
}
else {
echo "wrong";
}
}
else
{
$insert=mysql_query("insert into login values('".$mail."','".$password."')") or die(mysql_error());
echo "insert";
}
?>
ЗАМЕТКИ:
Рассмотрите возможность использования функций mysqli_ *, а не mysql_ *, поскольку они устарели.
В настоящее время ваш код подвержен множеству уязвимостей, особенно если ваши значения не экранированы.
Есть ли какая-то особая причина для установки вашего типа контента в text/plain? Это PHP-скрипт.
Вы должны изменить
if(crypt($user_input,$pp[0])==$pp[0])
в
if(crypt($user_input)==$pp[0])
Вы пытались использовать $pp[0]
в качестве соли для функции склепа. Соль - это то, что определяет алгоритм шифрования. По мере того, как вы оставили этот аргумент пустым на вставке passwort, функция crypt автоматически использовала MD5 для шифрования.
Это поможет (возможно, не рекомендовал php.net):
http://php.net/manual/en/function.crypt.php
У вас могут быть проблемы, потому что у вас нет второго аргумента.
поваренная соль
Необязательная соль-строка, чтобы основать хеширование. Если это не предусмотрено, поведение определяется реализацией алгоритма и может привести к неожиданным результатам.