【问题标题】:DELETE IN with explode()使用 explode() 删除
【发布时间】:2013-09-18 11:24:40
【问题描述】:

我有一个表单,可以将一组交易 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")'

这似乎是自找麻烦。我如何保护自己免受灾难(恶意或其他)?有没有一种有效的方法来清理阵列?还是我应该换一种方式?

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

【问题讨论】:

  • 循环遍历帖子 trnsid 并检查是否全部为 int
  • 使用 PDO 和准备好的语句。
  • @Mihai:使用具有可变数量值的准备好的语句有点棘手。此外,MySQLi 还支持预处理语句。
  • @RocketHazmat 一个不排除另一个..但我很好奇,你会如何为准备好的语句使用可变数量的参数?
  • @Mihai:这是你的建议。无论如何,您必须计算元素的数量并添加那么多?s,然后可能使用call_user_func_array() 来调用bind_param 函数。

标签: php mysql sql arrays


【解决方案1】:

您最好在使用 $_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.')';

【讨论】:

  • 感谢您的反馈。这几乎是我认为我需要采取的方向,但其他人的验证总是有帮助的,也是我在测试中工作的一个例子。
【解决方案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 替换为,嗯.... 你的转义函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多