MYSQL автоматически расшифровывает мой пароль при вводе записи

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

Затем, используя mysqli_insert_id (), я запускаю другой запрос, чтобы обновить только что добавленную запись, зашифровав пароль с помощью md5.

Но каждый раз, когда я запускаю его, запись добавляется, но пароль не обновляется с версией пароля md5. Я повторил запрос, и он показывает, что он должен обновлять пароль с шифрованием, но это не так. Любые идеи?

<?php
session_start();
error_reporting(E_ALL);

if (array_key_exists("submit", $_POST)) {
    $link = mysqli_connect("localhost", "eits_Admin", "WebSpinner1", "EITS_Sandbox");
    if (!$link) {
        die("Database connection error");
    }
    $error = '';
    if (!$_POST['email']) {
        $error .= "<br/>An email address is required";
    }
    if (!$_POST['password']) {
        $error .= "<br/>A password is required";
    }   
    if ($error != "") {
        $error = "There were errors in your form - ".$error;
    } else {
        $query = "select id from secretdiary 
                  where email = '".mysqli_real_escape_string($link, $_POST['email'])
                ."' limit 1";
        // echo $query;
        $result = mysqli_query($link, $query);
        if (mysqli_num_rows($result) > 0) {
            $error = "That email address is not available.";
        } else {
            $query = "insert into secretdiary 
                                (email,password) 
                      values ('" . mysqli_real_escape_string($link, $_POST['email']) 
                        . "', '" 
                        . mysqli_real_escape_string($link, $_POST['password']) . "')";

            if (!mysqli_query($link, $query)) {
                $error = "Could not sign you up at this time. Please try again later.";
            } else {
                $encPass = md5(md5(mysqli_insert_id($link)) . $_POST['password']);
                $query = "update secretdiary 
                            set password = '" . $encPass 
                        . "' where id = " . mysqli_insert_id($link) . " limit 1";
                echo $query;
                $result = mysqli_query($link,$query);
                echo "Sign up successful.";
            }
        }
    }
}
?>
<div id = "error"><? echo $error; ?></div>
<form method = "post">
  <input type = "email" name = "email" placeholder= "Your Email">
  <input type = "password" name = "password" placeholder = "Password">
  <input type = "checkbox" name = "stayLoggedIn" value=1>
  <input type = "submit" name = "submit" value = "Sign Up!">
</form>

первый INSERT будет незашифрованным (на самом деле un-хешированный, вы не шифрование ничего - стоит понимать разницу). Он не будет преобразован в хешированную версию до тех пор, пока не будет запущена команда UPDATE. Если вы считаете, что ОБНОВЛЕНИЕ завершается ошибкой, проверьте, нет ли ошибки - вы ничего не делаете с $result, который возвращается по этому запросу.

ADyson 18.12.2018 17:01

Однако я не могу понять, почему вы просто не добавляете хеширование в первый раз, когда вы вставляете? По отдельности вроде нет смысла делать. Что было для этого причиной? Я вижу, что вы используете сгенерированный идентификатор в хэше, но вы также можете использовать любое случайное значение, если вы знаете, что это такое. Фактически, я бы сказал, что использование идентификатора - это идея плохой, поскольку он очень легко обнаруживается и потенциально может быть легко использован для попытки взломать хэш.

ADyson 18.12.2018 17:02

И, наконец, md5 больше не является безопасным - оборудование достаточно мощное, чтобы его использовать. Двойное хеширование может немного помочь, но было бы лучше просто использовать рекомендованную PHP функциональность password_hash ().

ADyson 18.12.2018 17:02

И неплохо было бы сделать небольшой отступ в коде. Это помогает нам читать код и, что более важно, помогает вы отлаживаете свой кодВзгляните на стандарт кодирования для вашей же выгоды. Вас могут попросить изменить этот код через несколько недель / месяцев, и в конце вы будете благодарить меня.

RiggsFolly 18.12.2018 17:07

Извините еще за одну вещь, это также сделало бы ваш SQL намного более читаемым (и немного более безопасным и несколько менее подверженным неожиданным синтаксическим ошибкам), если бы вы начали использовать подготовленные заявления вместо mysqli_real_escape_string.

ADyson 18.12.2018 17:11

Также ваш сценарий широко открыт для Атака с использованием SQL-инъекции Даже если вы избегаете ввода, это небезопасно! Используйте подготовленные параметризованные операторы в API MYSQLI_ или PDO

RiggsFolly 18.12.2018 17:11

Пожалуйста, не используйте хеширование пароля катить свой собственный, особенно без использования MD5 () или SHA1 (). PHP предоставляет password_hash() и password_verify(), пожалуйста, используйте их. И вот несколько хорошие идеи о паролях Если вы используете версию PHP до 5.5 здесь доступен пакет совместимости

RiggsFolly 18.12.2018 17:14

@BarryBeach Приведенный ниже код делает именно то, что вам нужно. Просто ответил

Isaac 18.12.2018 17:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
8
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть много строк кода для относительно простого процесса. Лично ваша обработка ошибок формы, например, если она пуста (в этом случае), может быть исправлена ​​путем добавления required в конце каждого элемента ввода HTML-формы (это то, что я бы сделал)

Во-вторых, md5 небезопасен для хеширования паролей (вы хешируете пароль, а не шифруете его).

В-третьих, вот способ хеширования пароля из формы с помощью Bcrypt, что намного лучше, чем использование хеширования md5. Так что сделайте любую проверку ошибок, которую вам нужно выполнить, прежде чем like counting the usernames and if row > 0 die('username exists) Пример полного кода в базе с использованием PDO

При проверке логина пользователей просто используйте для этого функцию password_verify().

Аккуратный код помогает людям на SO понять, в чем ваша проблема, и, как правило, его легче читать. Я знаю, что вы, возможно, просто ищете что-то, что «Делает работу», но это помогает вам при отладке и нам, когда вы просите о помощи.

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

index.php

    <form method = "post" id = "regform" action = "register.php">
    <input type = "text" name = "username" placeholder = "Enter your email    Address"required/>
    <input type = "password" name = "password" placeholder = "Enter your password" required/>
    <input type = "submit" class = "indexbttn" id = "indexbttn" name = "enter"value = "enter"/>
</form>

connect.php

<?php
$servername = "localhost";
$dbusername = "root";
$dbpassword = "root";
$dbname = "fyp";
try{
$pdo = new PDO("mysql:host=$servername;dbname=$dbname",$dbusername,   $dbpassword);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
print "Error! Unable to connect: " . $e->getMessage() . "<br/>";
die();
}
?>

register.php

<?php
session_start();
require_once ('connect.php');
error_reporting(E_ALL);
ini_set('display_errors', 1);

 if (isset($_POST['enter'])){
  $username = !empty($_POST['username']) ? trim($_POST['username']) : null;
  $pass = !empty($_POST['password']) ? trim($_POST['password']) : null;
  $check (!filter_var($_POST['username'], FILTER_VALIDATE_EMAIL));

  $cnt = "SELECT COUNT(username) AS num FROM users WHERE username = :username";
  $stmt = $pdo->prepare($cnt);
  $stmt->bindValue(':username', $username);
  $stmt->execute();
  $row = $stmt->fetch(PDO::FETCH_ASSOC);
  if ($row['num'] > 0){
      die('That username already exists!');
  }
  $passHash = password_hash($pass, PASSWORD_BCRYPT, array("cost" => 12));
  $insrt = "INSERT INTO users (username, password) VALUES (:username, :password)";
  $stmt = $pdo->prepare($insrt);
  $stmt->bindValue(':username', $username);
  $stmt->bindValue(':password', $passHash);
  $result = $stmt->execute();
  if ($result){
    header( "refresh:5;url=index.php" );
echo 'You will be redirected in  5 seconds. If not, click <a       href = "index.php">here</a>.';
  }
}
?>

login.php

<?php
 session_start();
require("connect.php");
  if (isset($_POST['enter'])){
$username = !empty($_POST['username']) ? trim($_POST['username']) :   null;
 $pass = !empty($_POST['password']) ? trim($_POST['password']) : null;
$rtrv = "SELECT username, password, userid FROM users WHERE username =       :username";
  $stmt = $pdo->prepare($rtrv);
  //Bind value.
  $stmt->bindValue(':username', $username);
  //Execute.
  $stmt->execute();
  //Fetch row.
   $user = $stmt->fetch(PDO::FETCH_ASSOC);
  //If $row is FALSE.
  if ($user === false){
  //Could not find a user with that username!
  die('Incorrect username');
  }
  else{
      $validPassword = password_verify($pass, $user['password']);
    if ($validPassword){
        $_SESSION['user_id'] = $user['username'];
        $_SESSION['logged_in'] = time();
        header( "Location: /protected.php" );
        die();
      } else{
          die('Wrong password!');
    }
   }
 }
 ?>

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

Isaac 18.12.2018 17:36

@BarryBeach Почему ты обижаешься? Если бы вы знали, что код уже плохой и это было что-то, что вы копировали из Udemy, вам следовало бы более четко сформулировать свой вопрос.

kojow7 18.12.2018 17:57

@BarryBeach, MD5 никогда не был стандартом для паролей. Всегда. К сожалению, это просто плохая привычка разработчиков PHP. Я призываю вас подумать о поиске лучшего курса. Кажется, это преподает действительно плохие практики. Другое, например, отсутствие параметризованных запросов.

Peter 18.12.2018 18:08

Другие вопросы по теме