Как мне вставить запись в таблицу SQL, используя переменную, полученную от POST - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь передать текстовые переменные из формы с предыдущей страницы и вставить ее в таблицу SQL. Проблема, с которой я столкнулся, находится в строке: $ sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ($ firstName, 'smith')";.

Если бы я заменил "$ firstName »с базовой строкой c, такой как« John », имя и фамилия будут вставлены в таблицу SQL, как задумано. Но, поскольку я пытаюсь вставить текстовое значение, полученное из формы, мне нужно иметь возможность использовать нестатические c переменные, но по какой-то причине, которую я не могу понять, не работает. Из всего, что я читал в Интернете, простое добавление переменной в параметр должно заставить его работать, но это не так.

Я новичок в этом, поэтому извините, если мой вопрос сбивает с толку. Кроме того, я совершенно уверен, что проблема не в файле с формой. Любая помощь была бы такой потрясающей. спасибо!

Вот код, с которым у меня проблемы:

<html>
<?php

$username = $_Post['username'];
$email = $_Post['email'];
$phone = $_Post['number'];
$firstName = $_Post['firstName'];
$lastName = $_Post['lastName'];
$address = $_Post['address'];
$password = $_Post['password'];

$conn = new mysqli('localhost','root','password','database');
 if($conn->connect_error){
        echo "$conn->connect_error";
        die("Connection Failed : ". $conn->connect_error);
    } else {
        
        $sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ($firstName, 'smith')";
        $conn->query($sql);
        
        echo $execval;
        echo "Registration successfully...";
        $conn->close();
    }
?>
</html>

Ответы [ 4 ]

0 голосов
/ 01 августа 2020

Чтобы обобщить все остальные ответы,

Сначала вы должны заменить $ firstName на '$ firstName' , потому что в противном случае текст (например, «John») будет помещен в ваш запрос без кавычки, например: INSERT INTO CUSTOMER (fname, lname) VALUES (John, 'smith') Это приводит к ошибке, потому что он думает, что John - это какая-то переменная.

Во-вторых, ваш код уязвим для SQL Injection . Это очень серьезная уязвимость на вашем веб-сайте, так как злоумышленники могут использовать ее для чтения всей вашей базы данных и в этом случае даже создавать записи в вашей базе данных, что может привести к тому, что злоумышленники смогут полностью захватить ваш сайт, записав файлы!

Более подробная информация здесь: https://owasp.org/www-community/attacks/SQL_Injection

Важно то, что пользователь может управлять переменной $ firstName, которую вы используете в $sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ('$firstName', 'smith')"; Таким образом, злоумышленник может изменить запрос в этот момент. Например, он мог бы использовать полезную нагрузку ', 'a'); DROP TABLE CUSTOMER;-- для удаления всей информации в таблице CUSTOMER.

Есть несколько способов предотвратить это, но самый простой - использовать подготовленные операторы. Это выглядит примерно так:

$stmt = $dbConnection->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
$stmt->bind_param('ss', $param_firstName, $param_lastName);
$param_firstName = $firstName; // New line
$param_lastName = $lastName; // New line
$stmt->execute();

Таким образом вы убедитесь, что MySQL не интерпретирует ввод пользователя как код SQL, а только как значения.

Опять же, еще подробная информация здесь:

https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html

0 голосов
/ 01 августа 2020

В качестве быстрого исправления вы можете обновить свой $ sql следующим образом:

$sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ('{$firstName}', '{$lastName}')";

Но теперь ваш код уязвим для SQL Injection. По крайней мере, вы должны использовать функцию escape mysqli перед оператором $ sql, например:

$firstName = $mysqli->real_escape_string($firstName);
$lastName = $mysqli->real_escape_string($lastName);

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

0 голосов
/ 01 августа 2020

Заменить $firstName на '$firstName'. или используйте подготовленный запрос

0 голосов
/ 01 августа 2020

Если вы получаете пользовательский ввод для вставки в базу данных, вы всегда должны использовать «Подготовленные операторы», чтобы предотвратить «SQL инъекцию» или аналогичные вещи.

Отметьте здесь:

PHP Подготовленные операторы - w3school

Решение Aashi sh gaba также должно работать, но оно небезопасно.

Это должно работать для вашего кода:

<?php

$username = $_POST['username'];
$email = $_POST['email'];
$phone = $_POST['number'];
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
$address = $_POST['address'];
$password = $_POST['password'];

$conn = new mysqli('localhost','root','password','database');
 if($conn->connect_error){
        echo "$conn->connect_error";
        die("Connection Failed : ". $conn->connect_error);
    } else {
        $stmt = $conn->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
        $stmt->bind_param("ss",$fname, $lname);

        // set parameters and execute
        $fname = $firstName;
        $lname = $lastName;
        $stmt->execute();
        
        echo $execval;
        echo "Registration successfully...";
        $conn->close();
    }
?>

Приятно иметь подготовленный оператор, потому что его можно использовать повторно, например:

// set parameters and execute
$fname = "person1_fname";
$lname = "person1_lname";
$stmt->execute();

$fname = "person2_fname";
$lname = "person2_lname";
$stmt->execute();

Также не забудьте использовать что-то, чтобы предотвратить другие инъекции, если вы печатаете значение в пользователь. Например:

echo "Registration successfully for" . htmlspecialchars($_Post['username']);

Кроме того, сохраните пароль как ha sh (с защищенной хеш-функцией) в базе данных.

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