$ 와 # 은 마이바티스에서 변수를 쿼리문에 입력하려고 할때 사용하는 표현식입니다.
# 은 변수의 타입에 맞게 타입변환 후 삽입
$ 는 변수를 SQL 문에 그대로 삽입
/* 아래 두가지 방식이 있고 사용자가 입력값을 문자열 형식으로 사용자1 이라고 입력할 경우 */
SELECT * FROM TB_USER WHERE user_id = #{id}
쿼리문 실행 시 => SELECT * FROM TB_USER WHERE user_id = '사용자1'
/* id 변수의 타입(정수,문자열..)에 따라 타입변환 후 입력 */
SELECT * FROM TB_USER WHERE user_id = ${id}
쿼리문 실행 시 => SELECT * FROM TB_USER WHERE user_id = 사용자1
/* id 변수의 값이 입력된 그대로 입력 */
/* 그래서 $는 변수에 문자열이 입력되는 경우에는 '${id}' 처럼 별도로 ' '로 감싸줘야 함 */
두가지 방식중에 가급적 # 사용을 권장하는데 그 이유는
$ 를 사용하는 경우 사용자가 입력한 값을 그대로 쿼리문에 포함시켜서 SQL Injection 공격에 취약할 수 있습니다
예를 들면 아래 예시처럼 사용자가 악의적으로 id 값에 "" OR 1=1 과 같이 값을 입력하게 되면
id 값을 조건으로 result가 id 값에 매칭되는 특정 row 가 아닌 해당 테이블의 전체 row 가 조회될 수 있습니다
SELECT * FROM TB_USER WHERE user_id = ${id}
/* id 입력값에 "" OR 1=1 를 입력한 경우 */
SELECT * FROM TB_USER WHERE user_id = "" OR 1=1
'MyBatis' 카테고리의 다른 글
이클립스 마이바티스 매퍼 mapper xml DOCTYPE dtd 컴파일 에러 (어플리케이션 실행 및 쿼리 실행에 문제는 없는데 에러 떠 있는 경우) (3) | 2024.02.25 |
---|---|
MyBatis <choose> 마이바티스 choose / SQL INSERT or UPDATE 시 변수값이 null or ""(빈문자열) 일 때 기본값 세팅 (1) | 2023.07.29 |
MyBatis 마이바티스 MySQL 일괄 insert, 다중 insert / <foreach> (0) | 2023.04.23 |
MyBatis 마이바티스 MySQL UPDATE 누적 합계 (INT 자료형) (0) | 2023.02.11 |
MyBatis 마이바티스 주석 작성시 주의사항 (0) | 2023.01.21 |
최근댓글