Skip to content

Commit a497179

Browse files
committed
fix: escape LIKE query input
1 parent 648ac84 commit a497179

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

lib/db.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { env } from './env'
1313
import { logger } from './logger'
1414
import { migrations } from './migrations'
1515

16+
// we only really use bigint for timestamps, so we can safely parse them as numbers
1617
pg.types.setTypeParser(20, Number)
1718

1819
export const cacheEntrySchema = z.object({

lib/storage.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ import { env } from './env'
3232
import { generateNumberId } from './helpers'
3333
import { logger } from './logger'
3434

35+
function escapeLikePattern(value: string) {
36+
return value
37+
.replaceAll('\\', '\\\\')
38+
.replaceAll('%', String.raw`\%`)
39+
.replaceAll('_', String.raw`\_`)
40+
}
41+
3542
export class ObjectNotFoundError extends Error {
3643
constructor(objectName: string) {
3744
super(`Object not found in storage: ${objectName}`)
@@ -402,7 +409,9 @@ export class Storage {
402409

403410
const prefixedPrimaryMatch = await this.db
404411
.selectFrom('cache_entries')
405-
.where('key', 'like', `${primaryKey}%`)
412+
.where(
413+
sql<boolean>`${sql.ref('key')} like ${`${escapeLikePattern(primaryKey)}%`} escape ${'\\'}`,
414+
)
406415
.where('version', '=', version)
407416
.where('scope', '=', scope)
408417
.where('repoId', '=', repoId)
@@ -436,7 +445,9 @@ export class Storage {
436445

437446
const prefixedMatch = await this.db
438447
.selectFrom('cache_entries')
439-
.where('key', 'like', `${key}%`)
448+
.where(
449+
sql<boolean>`${sql.ref('key')} like ${`${escapeLikePattern(key)}%`} escape ${'\\'}`,
450+
)
440451
.where('version', '=', version)
441452
.where('scope', '=', scope)
442453
.where('repoId', '=', repoId)

0 commit comments

Comments
 (0)