如何使用从post接收的变量向sql表插入条目

zfciruhq  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(233)

我尝试将表单中的文本变量传递到上一页,并将其插入到sql表中。我遇到的问题是:$sql=“insert into customer(fname,lname)values($firstname,'smith')”;。
如果将“$firstname”替换为“john”这样的基本字符串,则名称和姓氏将按预期插入到sql表中。但是,因为我试图插入一个从表单中收集的文本值,我需要能够使用非静态变量,但是由于某种原因,我无法理解,无法工作。从我在网上读到的所有内容来看,只要将变量添加到参数中就可以使它工作,但事实并非如此。
我对这个很陌生,如果我的问题让人困惑,我很抱歉。此外,我相当肯定,问题不在于文件上的形式。任何帮助都太棒了。谢谢!
以下是我遇到问题的代码:

<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>
fafcakar

fafcakar1#

总结所有其他答案,
首先,您应该将$firstname替换为'$firstname',否则文本(例如“john”)将不带引号地放在查询中,如下所示: INSERT INTO CUSTOMER (fname, lname) VALUES (John, 'smith') 这会导致一个错误,因为它认为john是某种变量。
其次,您的代码易受sql注入攻击。这是您网站中的一个非常严重的漏洞,因为攻击者可以使用它读取您的整个数据库,在这种情况下,甚至可以在您的数据库中创建条目,这可能导致攻击者能够通过编写文件完全接管您的网站!
更多详细信息请点击此处: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

p5cysglq

p5cysglq2#

如果要将用户输入插入到数据库中,则应始终使用“prepared statements”来防止“sql注入”或类似的操作。
点击此处:
php编写的报表-w3school
aashish-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();

如果您向用户打印值,也不要忘记使用somthing来防止其他注入。比如:

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

此外,将密码另存为哈希(使用安全的哈希函数)到数据库中。

holgip5t

holgip5t3#

作为一个快速解决方案,您可以像这样更新$sql: $sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ('{$firstName}', '{$lastName}')"; 但是现在您的代码很容易受到sql注入的攻击。
在$sql语句之前,至少应该使用mysqli escape函数,如下所示:

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

但我强烈建议您考虑在后续步骤和生产环境中使用更高级的选项,如pdo。

enxuqcxy

enxuqcxy4#

重新放置 $firstName'$firstName' . 或使用准备好的请求

相关问题