更新MySQLI PHP的代码

时间:2013-12-09 10:36:57

标签: php mysql database mysqli

有些人一直告诉我,我的mysqli查询中更新数据的代码非常不安全。实际上,这个网站上有几个人。因此,我想知道他们所说的将保护我的代码,以便在更新数据库时保证安全。我想知道如何保护我的mysqli查询。

好的,在我的数据库条目代码中,这就是我的工作。首先让我说我总是通过POST方法发送,以避免浏览器URL的复杂化。

当我收到POST数据时,这是我的代码。

$ID = 1;
$DATA = htmlentities(addslashes($_POST['data']));
$FIELD = "lifename";
$DBQUERY = "UPDATE `lifetable` SET `$FIELD` = '$DATA' WHERE `id` = $ID";
$DBRESULT = $MYSQLI->query($DBQUERY);

我目前在我的本地网站上使用此功能。

如果我从所有引号,所有斜杠,所有&符号(从javascript到ajax)和所有半冒号转义,这怎么会不安全?这有什么可怜的?

所以你能告诉我在向数据库添加信息时应该改变什么。

由于

PS ...我正在使用mysqli并将继续使用它。感谢

3 个答案:

答案 0 :(得分:1)

有些人建议我从mysqli更改为pdo,但我不愿完全100%更改我从数据库访问数据的方式。有人在约preparebind_param之前发布了另一个链接,这就是我要使用的内容。谢谢你。

现在这是我的代码,并且绑定参数应该是这样的,以便每个参数只用于我的查询的一部分而不能用于其他任何事情,除此之外别无其他。

    $DBQUERY = "UPDATE `lifetable` SET `lifename` = ? WHERE `id` = ?"; // EACH ? IS A PART OF bind_param BELOW IN ORDER AFTER TYPE.

    $STMT = $MYSQLI->prepare($DBQUERY);
    $STMT->bind_param('si', $DATA, $ID); // THIS MAKES SURE THAT THE VARIABLES ARE ONLY USED FOR THERE PLACE HERE AND NOTHING ELSE. ? in order.

    $DATA = htmlentities($_POST['data']); // I STILL USE MY CODE HERE TO REMOVED ANY OTEHR CHARACTERS, JUST INCASE. AND BEFORE IT GETS HERE, IT USES encodeURIComponent TO OUTPUT FROM AJAX.
    $ID = $COLUMN[1];

    $STMT->execute();
    $STMT->close();

我的代码之前有效,现在可以使用,更安全,或者我被告知。

答案 1 :(得分:0)

我认为你的安全性在于SQL注入,我知道使查询安全的最佳方法是在var上使用mysql_real_escape_string。这里是一个来自php.net的例子

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$city = $mysqli->real_escape_string($city);
$mysqli->query("INSERT into myCity (Name) VALUES ('$city')")

您可以对查询应用相同的程序

$ID = 1;
$DATA = $MYSQLI->real_escape_string($_POST['data']));
$FIELD = "lifename";
$DBQUERY = "UPDATE `lifetable` SET `$FIELD` = '$DATA' WHERE `id` = $ID";
$DBRESULT = $MYSQLI->query($DBQUERY);

我编辑了上述内容,因为我在问题中忘记了lifename的引用。它们应该在原始代码中存在。

现在巡演查询应该是安全的:D 这里是对php.net文档的引用: http://cn2.php.net/manual/en/mysqli.real-escape-string.php

答案 2 :(得分:0)

使用PDO类:

$db = new PDO('mysql:host=localhost;dbname=<SOMEDB>', '<USERNAME>', 'PASSWORD');
$query = $db->prepare('UPDATE `lifetable` SET :FIELD = :DATA WHERE `id` = :ID');
$query->execute(array(
  ':FIELD' => $field,
  ':DATA' => $data,
  ':ID' => $id
));
$query->commit();

了解更多信息Are there good tutorials on how to use PDO?