FlawOpen

flawopen.com/Injeksi SQL di JavaScript/Prisma

Apakah Prisma $queryRaw aman dari SQL Injection?

Panduan referensi
Jawaban singkat

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.

TIDAK AMAN — gabungkan input ke dalam SQL
const userId = request.query.userId;
const query =
  `SELECT id FROM users WHERE id = ${userId}`;
const rows = await prisma.$queryRawUnsafe(query);
DIPERKUAT — ikat nilai dan batasi struktur SQL dengan allowlist
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

Mengapa $queryRawUnsafe tersedia?

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

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah interpolasi string di Rails where() aman? Apakah Sequelize query() aman dari SQL Injection? Apakah SQLAlchemy text() aman dari SQL Injection? Apakah pemeriksaan query sqlx saat kompilasi mencegah SQL injection? Apakah stored procedure kebal terhadap SQL injection? Apakah TypeORM QueryBuilder aman dari SQL Injection?