FlawOpen

flawopen.com/C# SQL Injection/NHibernate

NHibernate는 SQL Injection을 막을 수 있나요?

참고 가이드
간단한 답변

바인딩 매개변수는 쿼리 양식에 봉인된 값 카드를 넣는 것과 같습니다. 데이터베이스는 이를 명령이 아닌 데이터로 처리합니다. HQL 매개변수가 값을 분리합니다. 신뢰할 수 없는 텍스트를 HQL이나 SQL에 보간하면 쿼리 언어의 일부가 됩니다.

취약 — 입력을 HQL에 보간
var hql =
  $"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
  .UniqueResult<User>();
강화 — 값을 HQL 매개변수에 바인딩
var user = session.CreateQuery(
    "from User u where u.Id = :id")
  .SetParameter("id", userId)
  .UniqueResult<User>();

값은 바인딩하고 쿼리 구조는 제한

SetParameter()는 값을 HQL 텍스트와 분리해 전달합니다. 신뢰할 수 없는 값마다 이름 또는 위치 매개변수를 사용하세요. Native SQL도 이름 및 위치 매개변수를 지원합니다. ISQLQuery의 알맞은 바인딩 메서드를 사용하세요(예: 문자열 값에는 SetString()). 매개변수는 엔터티명, 속성명, 정렬 방향, 쿼리 조각을 나타내지 않습니다. 이는 쿼리 구조입니다. 선택 가능한 속성을 애플리케이션이 관리하는 고정 HQL 조각 목록에 매핑하세요. 매개변수화는 값이 구문으로 해석되는 것을 막지만 레코드 접근 권한까지 결정하지는 않습니다.

자주 묻는 질문

HQL 매개변수화가 레코드 접근 권한도 부여하나요?

아닙니다. 권한 검사는 계정이나 테넌트로 필터링하는 방식 등으로 현재 사용자가 접근 가능한 레코드만 쿼리하도록 제한해야 합니다.

참고 자료

함께 보기 SQL 인젝션(CWE-89): 동작 원리와 언어별 방어 방법 — flawopen.com MongoDB NoSQL Injection: 안전한 쿼리 필터 숫자 ID도 문자열 포맷팅으로 SQL Injection이 발생할 수 있나요? 매개변수화 쿼리란 무엇인가 Prisma $queryRaw는 SQL Injection에 안전한가요? Rails where() 문자열 보간은 안전할까요? Sequelize query()는 SQL Injection에 안전한가요?