flawopen.com/Injeksi SQL di JavaScript/Prisma
Apakah Prisma $queryRaw aman dari SQL Injection?
Bayangkan parameter sebagai ruang nilai tersegel pada formulir SQL: database memperlakukannya sebagai data, bukan sintaks. Tagged template $queryRaw mengikat nilai interpolasi. $queryRawUnsafe juga dapat mengikat nilai jika placeholder dan argumen diberikan terpisah; risikonya muncul saat teks tidak tepercaya digabungkan untuk membentuk SQL. Kedua metode tidak memparameterkan nama tabel atau kolom.
const userId = request.query.userId;
const query =
`SELECT id FROM users WHERE id = ${userId}`;
const rows = await prisma.$queryRawUnsafe(query);
const rows = await prisma.$queryRaw`
SELECT id FROM users WHERE id = ${userId}
`;
// PostgreSQL example: $1 binds data, not an identifier.
const columns = { name: 'name', created: 'created_at' } as const;
const column = columns[requestedSort as keyof typeof columns] ?? 'created_at';
const pageSize = 25;
const sortedRows = await prisma.$queryRawUnsafe(
`SELECT id FROM users ORDER BY ${column} LIMIT $1`,
pageSize
);
// The selected SQL structure comes from a fixed map.
Fungsi parameter Prisma — dan batasnya
Pada $queryRaw, gunakan langsung pemanggilan tagged template: setiap nilai interpolasi menjadi parameter database. Jangan merakit string SQL terlebih dahulu lalu memberikannya sebagai satu-satunya argumen. Prisma juga mendukung placeholder pada $queryRawUnsafe(query, ...values); cara ini dapat mengikat nilai, tetapi teks SQL harus tetap tepercaya. Parameter mewakili nilai data, bukan identifier, operator, atau fragmen SQL. Petakan kolom yang dapat dipilih ke allowlist tetap yang dikendalikan aplikasi. Prisma merekomendasikan TypedSQL untuk banyak kebutuhan raw query yang type-safe.
Cara mengaudit raw query Prisma
grep -rn "\$queryRawUnsafe\|\$executeRawUnsafe" --include="*.ts" --include="*.js" .Pertanyaan umum
Metode ini menerima string raw SQL dan mendukung placeholder jika nilai dikirim terpisah. Fleksibilitasnya memudahkan pembuatan string yang tidak aman, jadi periksa teks SQL dan argumen bersama-sama. Identifier dinamis tidak otomatis aman; pilih dari allowlist tetap.
Referensi
- Dokumentasi Prisma ORM — Raw query dan pencegahan SQL Injection
- Dokumentasi Prisma ORM — TypedSQL
- Dokumentasi Prisma — Akses raw database
- flawopen.com — SQL Injection di JavaScript