MYSQL: процедура с оператором if - PullRequest
2 голосов
/ 27 сентября 2011

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

Возможно ли это даже бездва запроса, которые вы обрабатываете в PHP?Сначала вызовите пароль, проверьте, правильно ли он, а затем разрешите пользователю изменить имя.

Вот пример получения строк пользователя с помощью электронной почты и пароля.

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_info`(
    IN in_Email VARCHAR(45),
    IN in_Pass VARCHAR(45)
    )
BEGIN
    SELECT * FROM User WHERE Email = in_Email AND Pass = in_Pass;
END

Ивот что я получил до сих пор:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45),
    in_PassOld VARCHAR(45),
    in_PassNew VARCHAR(45)
)
BEGIN
    SET @PassOld = (SELECT Pass From User WHERE Email = in_Email);

    IF(@PassOld = in_PassOld) THEN
        UPDATE User SET Pass = in_PassNew WHERE Email = in_Email;

    END IF;

ENDND IF;
END

Спасибо за помощь!

1 Ответ

7 голосов
/ 27 сентября 2011

Вы должны действительно хэшировать эти пароли, используйте следующий код

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45),
    in_PassOld VARCHAR(45),
    in_PassNew VARCHAR(45)
)
BEGIN
  DECLARE KnowsOldPassword INTEGER;

  SELECT count(*) INTO KnowsOldPassword 
    FROM User 
    WHERE Email = in_Email AND passhash = SHA2(CONCAT(salt, in_PassOld),512);
  IF (KnowsOldPassword > 0) THEN
    UPDATE User 
      SET Passhash = SHA2(CONCAT(salt, inPassNew),512) 
      WHERE Email = in_Email;
  END IF;
END $$

DELIMITER ;

* salt - это дополнительное поле в таблице user, которое является более или менее случайным, но не должно быть секретным,Он служит для победы над радужными таблицами .
. Вы можете задать соль для короткого строкового символа (10) или случайных данных.например,

salt = ROUND(RAND(unix_timestamp(now())*9999999999);

Вам не нужно обновлять соль, просто сгенерируйте ее один раз, а затем сохраните.

Подробнее об этом см.
Salting myхэши с PHP и MySQL
Как мне этически подходить к хранению пароля пользователя для последующего получения открытого текста?

Комментарий к вашему коду

IF(@PassOld == in_PassOld) THEN  //incorrect 
IF(@PassOld = in_PassOld) THEN   //correct, SQL <> PHP :-)
...