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

时间:2012-03-08 20:20:13

标签: php mysql

  

可能重复:
  Best way to stop SQL Injection in PHP

这是关于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>

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)
?>

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

编辑:我看了best way to stop sql-injection in php,但我对如何修改它感到有点困惑:

$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));

4 个答案:

答案 0 :(得分:15)

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

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

退房:Best way to stop SQL Injection in PHP

在回答您的问题时,以下是使用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);

答案 1 :(得分:7)

NO。

HIGHLY 容易受到SQL注入攻击。

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

答案 2 :(得分:1)

答案 3 :(得分:0)

$magic_quotes_active = get_magic_quotes_gpc();
$real_escape_string_exists = function_exists('mysql_real_escape_string');

function escape_value($sql) {
    if ($real_escape_string_exists) {
        if($magic_quotes_active) {
            $sql = stripslashes($sql);
        }
        $sql = mysql_real_escape_string($sql);
    } else {
        if(!$magic_quotes_active) {
            $sql = addslashes($sql);
        }
    }
    return $sql;
}

这被认为是一种将内容插入数据库的非常安全的方法。使用返回的$sql作为您的查询!

相关问题