我有一个表单,它将一组事务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")'
这似乎是在寻找麻烦。我如何保护自己免受灾难(恶意或其他)?有没有一种有效的方法来消毒阵列?或者我应该采取另一种方式?
任何想法或指导都将不胜感激。
答案 0 :(得分: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.')';
答案 1 :(得分: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替换为......你的转义函数。