有些人一直告诉我,我的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并将继续使用它。感谢
答案 0 :(得分:1)
有些人建议我从mysqli更改为pdo,但我不愿完全100%更改我从数据库访问数据的方式。有人在约prepare
和bind_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();