sha('$password') возвращает пустой набор

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

$sql "insert into users(username, password) values('$username, sha('$password'))";

Дублирующаяся запись «da39a3ee5e6b4b0d3255bfef95601890afd80709» для ключа «пароль», несмотря на то, что я несколько раз менял строку sha('$password'). пожалуйста помоги.

else{
   include("databaseconnection.php");
   $databaseconnect = connect($host,$user,$password,$database)
      or die("couldnot connect to database serever.\n");
   $database_select = mysql_select_db($database,$databaseconnect)
      or die("could not select dabases.\n " .mysql_error());
   $query2 = "insert into company(username,password)
      values('$username',sha1('$password'))";
   $result2 = mysql_query($query2,$databaseconnect);
   echo "you have been registered as '$companyloginName' <br/>";
   header("Location:/index.php");

мой php-скрипт входа выглядит следующим образом:

   $result ="select username, password form users where username ='$username' and password = sha('$password');
    if(mysql_num_rows($reuslt)==1){
   echo"welcome '$username";
    }

person sareeye    schedule 25.06.2011    source источник
comment
Почему у вас есть ограничение UNIQUE в поле пароля? Возможно ли, чтобы несколько пользователей имели один и тот же пароль?   -  person Emil Vikström    schedule 25.06.2011
comment
спасибо, что спросили об этом ... Я фактически удалил уникальное ограничение в поле пароля, но что происходит, так это то, что пользователи с разными паролями могут входить в учетную запись друг друга, потому что sha('$password') и sha('$password1') есть тот же «da39a3ee5e6b4b0d3255bfef95601890afd80709».   -  person sareeye    schedule 25.06.2011
comment
добавляя к тому, что сказал @Emil, ОБЯЗАТЕЛЬНО разрешите людям использовать один и тот же пароль или, по крайней мере, не показывать сообщения, если они вводят уже существующий пароль, потому что это сделает хорошую дыру в безопасности вашего приложения.   -  person Damien Pirsy    schedule 25.06.2011
comment
1. $databaseconnect закомментировано. 2. Вам не хватает = и закрывающей кавычки в переменной $sql.   -  person esqew    schedule 25.06.2011
comment
В целях безопасности не хешируйте пароли таким образом! Прочитайте этот ответ о том, как безопасно хешировать пароли   -  person Andrew Moore    schedule 26.06.2011


Ответы (3)


da39a3ee5e6b4b0d3255bfef95601890afd80709 — это хэш sha1 пустой строки. Убедитесь, что вы действительно вставляете пароль в свой запрос SQL, например, повторяя запрос, а не отправляя его на сервер SQL.

Изменить После того, как к вашему вопросу добавлена ​​новая информация, проверьте следующие две строки:

include("databaseconnection.php");
$databaseconnect = connect($host,$user,$password,$database)

Здесь $password — это пароль, используемый для подключения к базе данных. Включение databaseconnection.php, вероятно, перезаписывает то, что было ранее в переменной $password.

Попробуйте echo $query2 и вы, вероятно, сами увидите, что SQL-запрос вообще не содержит никакого пароля или что пароль в нем не совпадает с тем, который ввел пользователь.

person Emil Vikström    schedule 25.06.2011
comment
Спасибо, Эмиль, но я вижу, что имя пользователя действительно вставлено в базу данных, строка «da39a3ee5e6b4b0d3255bfef95601890afd80709» вставлена ​​в столбец пароля. все остальные столбцы таблицы пользователей заполнены правильно. - person sareeye; 25.06.2011
comment
вот код php: else { include (databaseconnection.php); /*$databaseconnect = connect($host,$user,$password,$database) или умереть(не удалось подключиться к серверу базы данных.\n);*/ $database_select = mysql_select_db($database,$databaseconnect) или умереть(не удалось выберите базы данных.\n .mysql_error()); $query2 = вставить в компанию (имя пользователя, пароль) значения ('$ имя пользователя', sha1 ('$ пароль')); $result2 = mysql_query($query2,$databaseconnect); echo вы зарегистрированы как '$companyloginName' ‹br/›; заголовок (Расположение:/index.php); - person sareeye; 25.06.2011
comment
@sareeye, пожалуйста, обновите вопрос, чтобы отразить это, тогда мы сможем ответить. - person Inca; 25.06.2011
comment
привет @inca, я обновил вопрос. Я действительно не вижу никаких проблем с моим php-кодом, я не понимаю, почему столбец пароля не заполнен? любая помощь будет принята с благодарностью. - person sareeye; 25.06.2011

Во-первых, я бы НАСТОЯТЕЛЬНО не советовал бы использовать только MySQL sha() или PHP sha1() для целей хеширования паролей. Это огромный риск для безопасности ваших пользователей, если ваша база данных будет скомпрометирована.

Пожалуйста, найдите время прочитайте мой предыдущий ответ на тему хеширования паролей для надлежащей защиты ваших данных.


Во-вторых, ваш код уязвим для атаки SQL Injection. Используйте mysql_real_escape_string(), чтобы избежать переменных, которые вы собираетесь поместить в свой запрос заранее.

$query2 = "insert into company(username,password)
  values('" . mysql_real_escape_string($username) .
          "', sha1('" . mysql_real_escape_string($password) . "'))";

В-третьих, ваша переменная $password перезаписывается вашим файлом databaseconnection.php.

include("databaseconnection.php");
$databaseconnect = connect($host,$user, $password ,$database);

Чтобы сделать акцент...

$databaseconnect = connect($host,$user,$password,$database);

Таким образом, $password, используемый позже в вашем запросе, по-прежнему содержит пароль для подключения к базе данных, а не пароль вашего пользователя.

Измените имя вашей переменной в databaseconnection.php или, что еще лучше, используйте массив для хранения всей конфигурации.

$dbConnectParams = array('host' => 'localhost'
                         'user' => 'myUser',
                         'pass' => 'myPassword',
                         'db' => 'myDB');

Затем измените код следующим образом:

include("databaseconnection.php");
$databaseconnect = mysql_connect($dbConnectParams['host'],
                           $dbConnectParams['user'],
                           $dbConnectParams['pass'],
                           $dbConnectParams['db']);

Поскольку вы уже передаете базу данных при вызове mysql_connect(), вам не нужно вызывать mysql_select_db().

person Andrew Moore    schedule 25.06.2011

Судя по закомментированной строке, возможно, вы случайно использовали пароль подключения, установленный в «databaseconnection.php», а не пароль пользователя — вы не показываете, как вы инициализируете строку $password.

Также обратите внимание на запятую в вашем sql, которой не должно быть:

insert into company(username,password,)
                                     ^

Я не проверял, является ли это причиной, но вам, вероятно, следует избавиться от нее и проверить ее снова.

Кроме того, серьезно рассмотрите pdo / подготовленные операторы для предотвращения sql-инъекций, тем более, если вы хотите вставить пароль из пользовательского ввода.

person Inca    schedule 25.06.2011
comment
большое спасибо. вы были правы, я случайно использовал пароль для подключения. молодец еще раз спасибо - person sareeye; 25.06.2011