这是将表单数据插入MySQL数据库的安全方法吗?不。

2022-08-30 10:54:55

可能的重复:
如何防止PHP中的SQL注入?

这是 w3schools.org 上的示例:

HTML 表单:

<html>
    <body>
        <form action="insert.php" method="post">
            Firstname: <input type="text" name="firstname" />
            Lastname: <input type="text" name="lastname" />
            Age: <input type="text" name="age" />
            <input type="submit" />
        </form>
    </body>
</html>

文件插入.php:

<?php
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("my_db", $con);

    $sql="INSERT INTO Persons (FirstName, LastName, Age)
          VALUES
          ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

    if (!mysql_query($sql,$con))
    {
        die('Error: ' . mysql_error());
    }
    echo "1 record added";

    mysql_close($con)
?>

我已经通读了这里的其他问题,但我找不到直接的答案,因为大多数问题都要复杂得多。

我看了如何防止PHP中的SQL注入?,但我对如何修改它有点困惑:

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $unsafeValue));

假设我使用了上面的HTML表单,并希望将数据从字段“firstname”插入到数据库中,它应该看起来像这样吗?还是我应该修改?column

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $firstname));

答案 1

您提供的示例将 post var 插入到数据库中,而无需先分析它们是否存在恶意用户输入。使用类型转换、转义/筛选函数、预准备语句等,然后再使用它们与数据库交互。

要遵循的一般规则是永远不要信任用户输入。曾!

结帐:在PHP中停止SQL注入的最佳方法

为了回答您的问题,以下是您如何使用 PDO 预准备语句处理整个表单。

$stmt = $db->prepare('INSERT INTO Persons (FirstName, LastName, Age) VALUES (:first_name, :last_name, :age)');

$stmt->execute(array(':first_name' => $first_name,':last_name' => $last_name, ':age' => $age));

如果您只想像您要求的那样在记录中插入一列,则语法为:

$stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)');

$stmt->execute(':first_name', $first_name);

答案 2

不。

非常容易受到sql注入攻击。

我建议不要使用 ,而是使用 预准备语句。mysql_real_escape_string


推荐