【发布时间】:2015-02-07 19:21:45
【问题描述】:
我猜这个问题已经在某个地方得到了回答,但我找不到解决方案,我把头发扯掉了。我有一个存储在 MySQL 中的 JSON 数组,如下所示:
[{"ip":"8.8.8.8","name":"Bob"},{"ip":"","name":""},{"ip":"","name":""},{"ip":"","name":""}]
我想替换特定对象的“ip”和“name”。所以我将$slot_num 设置为0 并尝试更改值和UPDATE 数据库。下面的 SELECT 子句应该没问题,因为它在其他地方多次使用。
//Recieves POST info such as ip=1.1.1.1&group=204&slot=3&name=help
$ip = $_POST['ip'];
$group_id = $_POST['group'];
$slot_num = $_POST['slot'] -1; //PHP receives slot num increased by 1. IE- $slot_num 1 would be array[0]
$name = $_POST['name'];
if($result = $mysqli->query("SELECT * FROM `open_groups` WHERE `group_id` = $group_id")) {
$row = mysqli_fetch_array($result);
$slot_ar = json_decode($row['players'], true);
//Check if array has correct number slots
if($slot_num => count($slot_ar) || !is_int($slot_num)){
die('Injection attempt');
}
$slot_ar[$slot_num]['ip'] = $ip;
$slot_ar[$slot_num]['name'] = $name;
$players = json_encode($slot_ar);
$players = $mysqli->real_escape_string($players);
if(!$mysqli->query("UPDATE `open_group` SET players = '$players' WHERE group_id = $group_id")) {
echo $mysqli->error;
exit;
}
if(!$mysqli->query("INSERT INTO `occupied`(`ip`, `group`) VALUES ('$ip', '$group_id')")) {
echo $mysqli->error;
exit;
}
echo "Success";
}
else echo $mysqli->error;
我是在错误地访问数组还是什么?
固定代码
$ip = $_POST['ip'];
$group_id = $_POST['group'];
$slot_num = $_POST['slot']; //PHP receives slot num increased by 1. IE- $slot_num 1 would be array[0]
$name = $_POST['name'];
if($result = $mysqli->query("SELECT * FROM `open_groups` WHERE `group_id` = $group_id")) {
$row = mysqli_fetch_array($result);
$slot_ar = json_decode($row['players'], true);
//Check if array has correct number slots
if($slot_num-1 >= count($slot_ar) || !is_numeric($slot_num)){
echo "Injection attempt";
exit;
}
$slot_ar[$slot_num-1]['ip'] = "$ip";
$slot_ar[$slot_num-1]['name'] = "$name";
$players = json_encode($slot_ar);
$players = $mysqli->real_escape_string($players);
if(!$mysqli->query("UPDATE `open_groups` SET players = '$players' WHERE `group_id` = $group_id")) {
echo "Update error";
exit;
}
if(!$mysqli->query("INSERT INTO `occupied`(`ip`, `group`) VALUES ('$ip', '$group_id')")) {
echo "Occupied error";
exit;
}
echo "Success";
}
else echo "Fail";
【问题讨论】:
-
你没有提到到底是什么问题。
-
您没有在任何地方转义
$players,因此您有语法错误并且可能存在SQL 注入漏洞。 -
@AlexanderO'Mara 转义 $name 和 $ip 而不是 $player 不是更好吗?此外,如果您想考虑注入,您需要检查 $_POST['num'] 不高于 json 数组中的位置数量,否则人们将通过注入创建新条目。
-
我逃脱了
$name,我将其添加到问题中。问题是数据库中的数据没有改变。 -
@CharlesForest 不!需要转义整个 JSON 字符串,而不仅仅是一些索引。确实,
$slot_num可能高于应有的值,这可能应该被提防,但这并不是一个危险的问题。