【问题标题】:PHP - execute function doesn't work with implodePHP - 执行功能不适用于内爆
【发布时间】:2018-07-22 22:08:23
【问题描述】:

好的,
我不知道到底是什么问题。所以,我决定把它贴在这里和你讨论。
问题是,当我在 PDO execute(array(implode(",",$imploded)))); 中使用 php 内爆函数时,它不起作用
当我在select语句中使用php implode函数“具有相同变量的相同函数”时,它可以正常工作!
我怀疑在语句中使用它是 SQL 注入的机会。

这是我的完整代码:

$exCat = explode(",", $article['Category']);
$getCats = $con->prepare("SELECT * FROM `Categories` WHERE `ID` IN (?)");
if (is_array($exCat)) {
    $getCats->execute(array(implode(",", $exCat))); /* This Is only displaying the first element */
} else {;
    $getCats->execute(array($exCat));
}
$getCATS = $getCats->fetchAll();

这对我来说很好。但是,我怀疑在语句中使用它是 SQL 注入的机会。

$exCat = explode(",", $article['Category']);
$anotherStmt = $con->prepare("SELECT * FROM `Categories` WHERE `ID` IN (" . implode(",", $exCat) . ")"); /* This Works fine */
$anotherStmt->execute();
$anotherCATS = $anotherStmt->fetchAll();

【问题讨论】:

  • “所以,我决定把它贴在这里和你讨论。 - 这不是讨论的地方,因为它往往会填满 cmets 区域。我(对于一个)不知道您要问的是什么或真正的问题是什么。如果您的代码在您将 cmets 放入每个代码时有效,并且觉得您可能仍然对注入持开放态度并询问其他人是否好的与否,那么帖子应该被移到某个地方的聊天室和/或发布在代码审查中。它有效还是无效?你在自相矛盾。
  • 好的,谢谢您的建议。我的问题很清楚,为什么 implode 可能在 execute() 上不起作用;当它放在sql语句上时它可以正常工作。我把它放在sql语句上没有问题,但这不会造成sql注入问题吗?

标签: php sql pdo sql-injection


【解决方案1】:

explode 在每个实例中都返回一个数组,因此不需要is_array。

您需要为要绑定的每个值使用占位符。我会使用 str_repeat 和 rtrim 来生成占位符,然后将分解后的数组传递给执行。

$exCat = explode(",", 'non commaed list, commaed');
$placeholders = rtrim(str_repeat('?,', count($exCat)), ', ');
$getCats = $con->prepare("SELECT * FROM `Categories` WHERE `ID` IN ({$placeholders})");
$getCats->execute($exCat);

【讨论】:

  • 我试试看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 2017-12-30
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多