Некоторые значения не передаются: два различных SQL - PullRequest
0 голосов
/ 28 апреля 2020

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

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

Дело в том, что он передает настройки, эта часть:

   if (!mysqli_stmt_prepare($stmt_setsettings, $usersettings_sql)) {
     array_push($errors, "Safe SQL failed, could not insert settings. Contact the helpdesk.");
   } else {
     mysqli_stmt_bind_param($stmt_setsettings, "sssss", $email_show, $fname_show, $lname_show, $private_account, $profile_style);
     mysqli_stmt_execute($stmt_setsettings);
   }

Но он не передает никакой необходимой мне информации (например, имя пользователя, имя, ...)

Кроме того, в конце кода ниже он должен перенаправить на новый профиль, обычно если это означает, что должно появиться сообщение «Что-то пошло не так, обратитесь в справочный центр. (SE100)», но это как обновляет страницу регистрации и не выдает ошибку, а есть ошибка: не отправка информации!

Я пытался найти похожие вопросы или исправления, но ничего полезного не нашел.

Можете ли вы проверить следующий код и дать мне знать, как обстоят дела с непредоставлением значений? Спасибо!

  // Finally, register user if there are no errors in the form
  if (count($errors) == 0) {
    $password = md5($password_1); // Encrypt the password before saving in the database

    $user_ip = $_SERVER['REMOTE_ADDR'];   // Getting the IP of the user
    $bio = $config['default-bio'];   // Setting default biography
    $profileimg = $config['default-profileimg'];   // Setting default profile image
    $timestamp = date('d.m.Y');  // Defining the current date
    $activity = "on"; // Defening wich state the user profile is in, online

    $userdata_sql = "INSERT INTO users (username, bio, activity, profileimg, regdate, email, password, firstname, lastname, gender, birthday, country, ip) 
                     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        $usersettings_sql = "INSERT INTO usersettings (show_email, show_fname, show_lname, private_acc, profile_style)
    VALUES (?, ?, ?, ?, ?)";

    $stmt_signup = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt_signup, $userdata_sql)) {
      array_push($errors, "Safe SQL failed, could not sign up. Contact the helpdesk.");
    } else {
      mysqli_stmt_bind_param($stmt_signup, "sssssssssssss", $username, $bio, $activity, $profileimg, $regdate, $email, $password, $fname, $lname, $sex, $bday, $country, $user_ip);
      mysqli_stmt_execute($stmt_signup);
    }

    $stmt_setsettings = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt_setsettings, $usersettings_sql)) {
      array_push($errors, "Safe SQL failed, could not insert settings. Contact the helpdesk.");
    } else {
      mysqli_stmt_bind_param($stmt_setsettings, "sssss", $email_show, $fname_show, $lname_show, $private_account, $profile_style);
      mysqli_stmt_execute($stmt_setsettings);
    }

    session_regenerate_id();
    $_SESSION['username'] = $username;
    $_SESSION['loggedin'] = true;

        // Generate user id
        $generateid_sql = "SELECT id FROM users WHERE username=? ORDER BY id";
        $stmt_generateid = mysqli_stmt_init($conn);

        if (!mysqli_stmt_prepare($stmt_generateid, $generateid_sql)) {
          array_push($errors, "Safe SQL failed, could not generate a new ID. Contact the helpdesk.");
        } else {
          mysqli_stmt_bind_param($stmt_generateid, "s", $username);
          mysqli_stmt_execute($stmt_generateid);

          $generateid_result = mysqli_stmt_get_result($stmt_generateid);
        }

        while ($id = mysqli_fetch_assoc($generateid_result)) {

        if ($id['username'] <= 0) {   // Checking if the user id is a valid id (not below or equal to 0), and if not, displaying a critical error
          array_push($errors, "Something went wrong whilst signing up, please refer to the helpcenter. (SE100)");
        }

        if ($id['username'] > 0) {          // Redirecting the user to his or her profile if it is a valid id
          header('location: /content/users/profile?id=' . $id['username'] . '');
        }
     } 
  }
}

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Прежде всего, ПОЖАЛУЙСТА, никогда не храните пароли, подобные этому:

$password = md5($password_1); // <-- Totally insecure

Вместо этого используйте встроенные функции password_hash() и password_verify(). См. https://www.php.net/manual/en/faq.passwords.php для хорошего обзора того, почему md5() небезопасен, и примеров того, как правильно обрабатывать хранение паролей.

Кроме того, я бы рекомендовал вывести пользователя из базы данных. и проверка пароля, ДО установки $_SESSION['loggedin'] = true.

Что касается вашего вопроса, я бы рекомендовал добавить дополнительную обработку ошибок и проверку результатов вокруг ваших звонков на $conn->prepare() и $stmt->bind_param. См. mysqli_stmt_execute () не выполняет подготовленный запрос для примеров того, как проверить $stmt->errors.

Другая общая рекомендация проверяет $stmt->affected_rows, чтобы увидеть, действительно ли выполняются ваши операторы вставки как вы ожидаете. Каждая из ваших вставок должна затрагивать 1 строку.

Наконец, включение журнала запросов MySQL может быть отличным инструментом для устранения неполадок: Как отобразить последние запросы, выполненные на MySQL?, Все ли SQL запросы в вашем коде отображаются в журнале? Попробуйте выполнить запросы вручную и посмотрите, правильно ли выглядят результаты.

0 голосов
/ 28 апреля 2020
// Finally, register user if there are no errors in the form
if (count($errors) == 0) {
    $password = md5($password_1); // Encrypt the password before saving in the database

    $user_ip = $_SERVER['REMOTE_ADDR'];   // Getting the IP of the user
    $bio = $config['default-bio'];   // Setting default biography
    $profileimg = $config['default-profileimg'];   // Setting default profile image
    $timestamp = date('d.m.Y');  // Defining the current date
    $activity = "on"; // Defening wich state the user profile is in, online

    $userdata_sql = "INSERT INTO users (`username`, `bio`, `activity`, `profileimg`, `regdate`, `email`, `password`, `firstname`, `lastname`, `gender`, `birthday`, `country`, `ip`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    $usersettings_sql = "INSERT INTO usersettings (`show_email`, `show_fname`, `show_lname`, `private_acc`, `profile_style`)
VALUES (?, ?, ?, ?, ?)";

    $stmt_signup = $conn->prepare($userdata_sql);
    $stmt_signup->bind_param("sssssssssssss", $username, $bio, $activity, $profileimg, $timestamp, $email, $password, $fname, $lname, $sex, $bday, $country, $user_ip);
    if(!$stmt_signup->execute()){
        array_push($errors,mysqli_error($conn));
    }

    $stmt_setsettings=$conn->prepare($usersettings_sql);
    $stmt_setsettings->bind_param("sssss", $email_show, $fname_show, $lname_show, $private_account, $profile_style);
    if(!$stmt_setsettings->execute()){
        array_push($errors,mysqli_error($conn));
    }

    session_regenerate_id();
    $_SESSION['username'] = $username;
    $_SESSION['loggedin'] = true;

    // Generate user id
    $generateid_sql = "SELECT `id`,`username` FROM `users` WHERE `username`=? ORDER BY `id` limit 1";

    $stmt_generateid=$conn->prepare($generateid_sql);
    $stmt->generateid->bind_param("s", $username);
    if(!$stmt_generateid->execute()){
        array_push($errors,mysqli_error($conn));
    }else{    
        $generateid_result = $stmt_generateid->get_result();
    }

    $username_assoc = mysqli_fetch_assoc($generateid_result);    
    if ($username_assoc['id'] > 0) {
        // Redirecting the user to his or her profile if it is a valid id
        header('location: /content/users/profile?id=' . $username_assoc['username'] . '');
    }else{
        array_push($errors, "Something went wrong whilst signing up, please refer to the helpcenter. (SE100)");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...