4

我有一个提交交易 ID 数组的表单,$_POST['transid']以便可以删除这些交易记录。

我通常mysqli_real_escape_string用来帮助防止攻击,但我不确定如何使用数组来解决它。以下是我的查询:

$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ("'.implode('","',$_POST[transid]).'")'

...这给了我这样的东西:

$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ("123","124","138","145")'

这似乎是在自找麻烦。我如何保护自己免受灾难(恶意或其他)?有没有一种有效的方法来清理阵列?或者我应该以另一种方式解决这个问题?

任何想法或指导将不胜感激。

4

2 回答 2

3

您最好在使用 $_POST 内爆之前对其进行消毒,为此您必须遍历它。@user870018 在结构上击败了我,但无论如何我都会这样做:

function sanitize($n)
{
    return your_escape_function_here($n);
}

$values = implode(",", array_map("sanitize", $_POST[transid]));
$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ('.$values.')';
于 2013-09-13T17:43:00.777 回答
2

在构建查询之前使用 foreach 循环;

foreach ($_POST[transid] as &$x) $x = your_escape_function_here($x);

或者(如果您经常以这种方式使用数组)将其构建到一个函数中,以使整个程序更简洁;

function sqlEscapeArray($arr){
foreach ($arr as &$x)
$x = your_escape_function_here($x);
return $arr;
}

然后像这样使用它;

$query = 'DELETE FROM TRANSACTIONS WHERE (transid) IN ("'.implode('","',sqlEscapeArray($_POST[transid])).'")';

当然,将 your_escape_function 替换为,嗯.... 您的转义函数。

于 2013-09-13T17:33:59.763 回答