关于php:这是一种将表单数据插入MySQL数据库的安全方法吗?

Is this a secure method to insert form data into a MySQL database?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Best way to stop SQL Injection in PHP

这是w3schools.org上的示例:

HTML表单:

1
2
3
4
5
6
7
8
9
10
11
12
<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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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注入的最佳方法,但是我对如何修改这个有点困惑:

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

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

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

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

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


提供的示例将post var插入数据库,而不首先分析它们是否有恶意用户输入。在使用类型转换、转义/过滤函数、准备好的语句与数据库交互之前,请先使用它们。

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

签出:停止PHP中的SQL注入的最佳方法

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

1
2
3
$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));

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

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

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

不。

这非常容易受到SQL注入攻击。

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


使用mysql-real-escape-string。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$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;
}

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