使用数组内爆的安全查询


Secure query using implode with array

我使用PDO,我的$_POST['arraywithdata']是一个具有数值值的数组。我认为这不够安全,我只是想确保自己不被黑客攻击。

这是我的代码:

$arr = $_POST['arraywithdata'];
$SQL->query("UPDATE `data_s` SET `set` = 1 WHERE `id` IN " . implode(", ", $arr));

正如你所看到的,我并没有检查邮政编码是否在int或其他类型中

我是否应该这样写:

implode(", ", (int) $arr)

?

我猜上面不会工作,因为数组不能是整数

您需要转换数组的每个值,而不是数组本身。您可以使用array_map来执行此操作:

implode(", ", array_map('intval', $arr))

这里array_mapintval应用于$arr的每个值,并返回一个带有返回值的新数组。

但是当您使用PDO时,您可能也会对PDO解决方案感兴趣。

将数组传递给脚本听起来有点混乱,如果我是您,我会这样做:

<input name="test[]" value="arrayitem1" type="text" />
<input name="test[]" value="arrayitem2" type="text" />

然后在PHP中,您可以使用foreach查找并检查is_int来循环遍历数据,或者使用array_mapintval一起使用explode

最近,我遇到了这个问题以下是我所做的,希望能有所帮助

$arr = array(20,40,50);
$query[] = "UPDATE `data_s` SET `set` = 1 WHERE `id` IN (";
$count = count($arr);
foreach($arr as $v)
{
   $query[] = (int)$v;
   if ($count > 1)
    {
      $sql[] =",";
    }
   $count--;
}
$query[] = ")";
$query = implode("'n", $query);
$SQL->query($query);

IT会给你这样的查询"UPDATE data_s SET set = 1 WHERE id IN (20,40,50)";