Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用数组内爆的安全查询_Php_Arrays_Security_Pdo - Fatal编程技术网

Php 使用数组内爆的安全查询

Php 使用数组内爆的安全查询,php,arrays,security,pdo,Php,Arrays,Security,Pdo,我使用的是PDO,我的$\u POST['arraywithdata']是一个带有数值的数组字段。我认为这还不够安全,我只是不想确定并阻止自己被黑客攻击 这是我的代码: $arr = $_POST['arraywithdata']; $SQL->query("UPDATE `data_s` SET `set` = 1 WHERE `id` IN " . implode(", ", $arr)); 正如你所看到的,我没有检查邮政编码是否为int或其他形式 我是否应该使用类似于: implo

我使用的是PDO,我的
$\u POST['arraywithdata']
是一个带有数值的数组字段。我认为这还不够安全,我只是不想确定并阻止自己被黑客攻击

这是我的代码:

$arr = $_POST['arraywithdata'];
$SQL->query("UPDATE `data_s` SET `set` = 1 WHERE `id` IN " . implode(", ", $arr));
正如你所看到的,我没有检查邮政编码是否为int或其他形式

我是否应该使用类似于:

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


我猜上面的方法行不通,因为数组不能是整数。

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

implode(", ", array_map('intval', $arr))
此处
array\u map
将应用于
$arr
的每个值,并使用返回值返回一个新数组


但是当您使用PDO时,您可能还对一个数组感兴趣。

将数组传递给脚本听起来有点混乱,如果我是您,我会执行以下操作:

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


然后在PHP中,您可以使用foreach查找循环数据并检查
是否为int
,或者使用
数组映射
intval
,然后
分解数据。

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

$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);
它会给你这样的疑问
“更新
数据集
SET
=1,其中
id
IN(20,40,50)”

好的一点-这确实是不安全的。我认为您需要逐个遍历每个值,确保它是int,或者转义它们
(int)$arr
将不起作用-它将破坏数组。您可以尝试使用占位符来执行此操作。请注意,需要括号+1,但其副作用是非数字参数将转换为
0
@Pekka这是真的。但一般来说,数字ID的序列以1开头。@Pekka,是的,但在执行上述查询之前,我将检查数据库中是否存在参数。