Skip to content

Commit a3dd3bd

Browse files
committed
PB-50121 Replace rand() with a static counter to generate unique bind-parameter placeholder (GITHUB passbolt#595)
(cherry picked from commit 4d1b480)
1 parent 3abba5b commit a3dd3bd

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

src/Model/Traits/Query/CaseSensitiveCompareValueTrait.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@
2626
*/
2727
trait CaseSensitiveCompareValueTrait
2828
{
29+
/**
30+
* Global counter for generating unique bind placeholder names.
31+
* A per-query counter (e.g. ValueBinder::placeholder()) is not sufficient because
32+
* queries can be combined via union(), which merges their bindings — identical
33+
* placeholder names across queries would silently overwrite each other.
34+
*
35+
* @var int
36+
*/
37+
private static int $placeholderCounter = 0;
38+
2939
/**
3040
* @param \Cake\ORM\Query\SelectQuery $query Reference query object.
3141
* @param mixed $col Column value to convert into case-sensitive binary.
@@ -41,7 +51,7 @@ public function getCaseSensitiveValue(SelectQuery $query, mixed $col): QueryExpr
4151
return $col;
4252
}
4353

44-
$valuePlaceholder = ':value_case_insensitive_' . rand();
54+
$valuePlaceholder = ':value_case_insensitive_' . self::$placeholderCounter++;
4555
$query = $query->bind($valuePlaceholder, $col, $this->getBindType($col));
4656

4757
return $query->newExpr()->add("CONVERT({$valuePlaceholder} using utf8mb4) COLLATE utf8mb4_bin");
@@ -65,7 +75,7 @@ public function getCaseSensitiveValues(SelectQuery $query, array $values): array
6575
$conditions = [];
6676
$values = array_unique($values);
6777
foreach ($values as $value) {
68-
$valuePlaceholder = ':value_case_insensitive_' . rand();
78+
$valuePlaceholder = ':value_case_insensitive_' . self::$placeholderCounter++;
6979
$conditions[] = $query
7080
->newExpr()
7181
->add("CONVERT({$valuePlaceholder} using utf8mb4) COLLATE utf8mb4_bin");

0 commit comments

Comments
 (0)