Sam Vorst Ответов: 1

Проверка значения Datasbase и действие, если это так, PHP


Всем привет,

У меня есть вопрос, у меня есть PHP-код для создания уникального идентификатора, но я хочу быть уверен, что он уникален. Если нет, то он должен выполнить действие: создать новый идентификатор, который еще не существует.
Это мой код.:
<?php

    function random_strings($length_of_string)
    {

        $str_result = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

        return substr(str_shuffle($str_result), 0, $length_of_string);
    }

    ob_start();

    echo random_strings(10);

    $Output = ob_get_contents();

    ob_end_clean();



    $conn = mysqli_connect("localhost", "probleem_uniqid", "Password", "DBname");

    if($conn === false){
        die("ERROR: Could not connect. " . mysqli_connect_error());
    }

    $Name = $_POST['Name'];
    $Email = $_POST['Email'];
    $Phone = $_POST['Phone'];
    $Problem = $_POST['Problem'];

    if ($stmt = mysqli_prepare($conn, "INSERT INTO ID (Id, Name, Email, Phone, Problem) VALUES (?, ?, ?, ?, ?)")) {
        mysqli_stmt_bind_param($stmt, "sssss", $Output, $Name, $Email, $Phone, $Problem);
        if (mysqli_stmt_execute($stmt)) {
          echo ' ';
          echo "<div id=\"PHP-output\"> Succesvol Verstuurd </div>";
        } else{
            echo ' ';
            echo "<div id=\"PHP-output\"> Sorry, Het kon niet worden verstuurd, probeer het later nog eens of neem contact op met de klantenservice. $sql.  </div>" . mysqli_error($conn);
        }
    }

    mysqli_close($conn);

?>


Что я уже пробовал:

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

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

PHP: SQL-инъекция - руководство пользователя[^]
РНР: Подготовленные инструкции и хранимые процедуры - руководство пользователя[^]

Sam Vorst

Как вы это делаете?
Извините за мою неопытность...

Richard Deeming

В документации есть много примеров:
PHP: mysqli::подготовка[^]
РНР: mysqli_stmt::bind_param[^]

Например:

if ($stmt = mysqli_prepare($conn, "INSERT INTO ID (Id, Name, Email, Phone, Problem) VALUES (?, ?, ?, ?, ?)")) {
    mysqli_stmt_bind_param($stmt, "sssss", $Output, $Name, $Email, $Phone, $Problem);
    if (mysqli_stmt_execute($stmt)) {
        ...
    }
}

Sam Vorst

Что будет, если я этого не сделаю? Это небезопасно или что-то в этом роде?

Richard Deeming

Крайне неуверенно.

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

Они могли бы добавить скрипт "crytominer" в нижней части каждой записи, так что каждый раз, когда ваши пользователи загружают страницу, скрипт использует их компьютер для майнинга биткойнов и отправки их злоумышленнику.

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

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]

Sam Vorst

Спасибо, но как применить это в моем коде, или код, который вы отправили, уже был таким?

Richard Deeming

Это был код, который я уже отправил - используйте mysqli_prepare, mysqli_stmt_bind_param и mysqli_stmt_execute для передачи значений параметров отдельно от запроса.

Sam Vorst

Хорошо ли это сейчас? Проверьте мое решение.

Richard Deeming

Выглядит нормально, но вы не должны были публиковать это как решение (если только это действительно не решило вашу проблему).

Нажмите на зеленую ссылку "улучшить вопрос" и обновите свой вопрос вместо этого.

Sam Vorst

О, Извините, я новичок, спасибо за совет

Sam Vorst

Вы знаете ответ на мой первоначальный вопрос? В любом случае спасибо за всю помощь до сих пор!

1 Ответов

Рейтинг:
12

Richard Deeming

Цитата:
ob_start();
echo random_strings(10);
$Output = ob_get_contents();
ob_end_clean();
Насколько я могу судить, это очень запутанный способ сказать:
$Output = random_strings(10);

Вам понадобится SQL-запрос, чтобы проверить, существует ли этот идентификатор уже. Вам нужно будет сгенерировать идентификатор и проверить, существует ли он внутри цикла, пока вы не найдете тот, который не существует. Например:
function generate_id($conn) {
    $stmt = mysqli_prepare($conn, "SELECT Count(1) FROM ID WHERE Id = ?");
    mysqli_stmt_bind_param($stmt, "s", $Id);
    mysqli_stmt_bind_result($stmt, $Count);
    
    do
    {
        $Id = random_strings(10);
        mysqli_stmt_execute($stmt);
    } while ($Count > 0)
    
    return $Id;
}
PHP: do-while - Manual[^]
PHP: mysqli_stmt::bind_result - руководство пользователя[^]

Как только вы откроете свое соединение, вызовите эту функцию, чтобы сгенерировать новый случайный идентификатор:
$conn = mysqli_connect("localhost", "probleem_uniqid", "Password", "DBname");

if($conn === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}

$Output = generate_id($conn);
...
NB: Все еще существует довольно небольшая вероятность того, что два запроса, выполняемые одновременно, могут сгенерировать один и тот же идентификатор, которого еще нет в базе данных, а затем попытаться вставить запись с этим идентификатором. Если предположить, что ваше поле базы данных правильно ограничено, чтобы быть уникальным, один запрос завершится неудачей.