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

mil*_*les 39 php mysql

可能重复:
在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>
Run Code Online (Sandbox Code Playgroud)

insert.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)
?>
Run Code Online (Sandbox Code Playgroud)

我在这里读过其他帖子,但找不到直接的答案,因为大多数都要复杂得多.

编辑:我看了在PHP中停止sql注入的最佳方法,但我对如何修改这个有点困惑:

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

$preparedStatement->execute(array(':column' => $unsafeValue));
Run Code Online (Sandbox Code Playgroud)

假设我使用上面的html表单并希望将字段'firstname'中的数据插入到数据库中,它应该是这样的吗?或者我应该修改column?:

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

$preparedStatement->execute(array(':column' => $firstname));
Run Code Online (Sandbox Code Playgroud)

sha*_*ruz 16

您提供的示例将post vars插入到数据库中,而不先分析它们是否为恶意用户输入.在使用类型转换,转义/过滤函数,预处理语句等与数据库交互之前,请使用它们.

要遵循的一般规则是永远不要相信用户输入.EVER!

检查:在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));
Run Code Online (Sandbox Code Playgroud)

如果您只想按照要求在记录中插入一列,则语法为:

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

$stmt->execute(':first_name', $first_name);
Run Code Online (Sandbox Code Playgroud)


Dan*_*ite 7

没有.

也就是说HIGHLY容易受到SQL注入式攻击.

mysql_real_escape_string我建议使用准备好的语句而不是使用.

  • 你应该使用准备好的语句。 (2认同)