Skip to content

Commit dbe6b49

Browse files
michalsngr8man
andcommitted
chore: harden database queue priority ordering
Co-authored-by: Bogdan Lambarski <matolq@gmail.com>
1 parent 3b57adf commit dbe6b49

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

src/Models/QueueJobModel.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,19 @@ private function skipLocked(string $sql): string
131131
*/
132132
private function setPriority(BaseBuilder $builder, array $priority): BaseBuilder
133133
{
134+
$priority = array_values($priority);
135+
134136
$builder->whereIn('priority', $priority);
135137

136138
if ($priority !== ['default']) {
139+
$escapedPriority = array_map([$this->db, 'escape'], $priority);
140+
137141
if ($this->db->DBDriver !== 'MySQLi') {
138142
$builder->orderBy(
139143
sprintf('CASE %s ', $this->db->protectIdentifiers('priority'))
140144
. implode(
141145
' ',
142-
array_map(static fn ($value, $key) => "WHEN '{$value}' THEN {$key}", $priority, array_keys($priority)),
146+
array_map(static fn ($value, $key) => "WHEN {$value} THEN {$key}", $escapedPriority, array_keys($escapedPriority)),
143147
)
144148
. ' END',
145149
'',
@@ -148,10 +152,7 @@ private function setPriority(BaseBuilder $builder, array $priority): BaseBuilder
148152
} else {
149153
$builder->orderBy(
150154
'FIELD(priority, '
151-
. implode(
152-
',',
153-
array_map(static fn ($value) => "'{$value}'", $priority),
154-
)
155+
. implode(',', $escapedPriority)
155156
. ')',
156157
'',
157158
false,

tests/Models/QueueJobModelTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,22 @@ public function testSkipLockedFalse(): void
5959

6060
$this->assertSame($sql, $result);
6161
}
62+
63+
public function testSetPriorityEscapesPriorityValues(): void
64+
{
65+
$model = model(QueueJobModel::class);
66+
$method = $this->getPrivateMethodInvoker($model, 'setPriority');
67+
$builder = $model->builder();
68+
69+
$priority = [
70+
'priority_key' => "default' THEN 0 ELSE 1 END --",
71+
'default',
72+
];
73+
74+
$result = $method($builder, $priority);
75+
$sql = $result->getCompiledSelect();
76+
77+
$this->assertStringContainsString($model->db->escape($priority['priority_key']), $sql);
78+
$this->assertStringNotContainsString('priority_key', $sql);
79+
}
6280
}

0 commit comments

Comments
 (0)