flawopen.com/JavaScript SQL Injection/Prisma
Prisma $queryRaw는 SQL Injection에 안전한가요?
쿼리 매개변수는 SQL 양식의 봉인된 값 칸과 같습니다. 데이터베이스는 이를 구문이 아닌 데이터로 처리합니다. $queryRaw의 tagged template은 보간된 값을 바인딩합니다. placeholder와 인수를 따로 전달하면 $queryRawUnsafe도 값을 바인딩할 수 있지만, 신뢰할 수 없는 텍스트를 연결해 SQL을 만들면 위험합니다. 두 방법 모두 테이블명이나 컬럼명을 매개변수화하지 않습니다.
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.
Prisma 매개변수의 역할과 한계
$queryRaw에서는 tagged-template 호출을 직접 사용하세요. 보간된 값마다 데이터베이스 매개변수가 됩니다. SQL 문자열을 먼저 조립해 단일 인수로 전달하지 마세요. Prisma는 $queryRawUnsafe(query, ...values)의 placeholder도 지원하므로 값을 바인딩할 수 있지만 SQL 텍스트 자체는 신뢰할 수 있어야 합니다. 매개변수는 데이터 값용이며 식별자, 연산자, SQL 조각을 대신하지 않습니다. 선택 가능한 컬럼은 애플리케이션이 관리하는 고정 allowlist에 매핑하세요. 여러 타입 안전 raw 쿼리 사례에서 Prisma는 TypedSQL 사용을 권장합니다.
Prisma raw 쿼리 점검 방법
grep -rn "\$queryRawUnsafe\|\$executeRawUnsafe" --include="*.ts" --include="*.js" .자주 묻는 질문
raw SQL 문자열을 받고 값을 별도 인수로 전달하는 placeholder를 지원합니다. 유연성이 큰 만큼 위험한 문자열 조립도 쉬우므로 SQL 텍스트와 인수를 함께 검토하세요. 동적 식별자를 안전하게 만들어 주지는 않습니다. 고정 allowlist에서 선택하세요.