반응형
Mybatis 환경에서 XML 파일에 SQL문을 작성할 때, 변수를 처리하는 방식에는 Literal 방식과 Bind 방식이 있다.
보통은 SQL Injection 이슈로 인해 Binding 방식인 #{}을 권장하지만 필요한 경우 Literal 방식인 ${}이 필요한 경우도 있는데, 보안 측면에서 권장하는 방식이 아니므로 이 부분을 고려하여 사용해야 한다.
${parameter}
- 파라미터 바로 출력
- 해당 컬럼의 자료형에 맞추어 파라미터 자료형이 변경
- SQL 인젝션 공격을 예방할 수 없어 보안 측면에서 권장하지 않음
(사용자 입력 파라미터 전달 시 사용 X) - 테이블이나 컬럼명을 파라미터로 전달 시 사용하거나 파라미터를 문자열로 List로 가공한 후 전달 시 사용
- 하드 파싱이라고 하며 DB는 바뀌는 파라메터에 따라 Shared Pool/Library Cache에서 다른 쿼리로 인식하여 매번 Hard Parsing이 이루어진다. 매번 실행계획이 바뀔 수 있다.
<select id="select_list" parameterType="HashMap" resultType="HashMap">
SELECT USER_NM
, USER_ID
FROM USER
WHERE USER_ID = ${USER_ID}
AND USER_PWD = ${USER_PWD}
</select>
#{parameter}
- 파라매터가 String 형태로 들어와 자동적으로 '파라미터' 형태가 된다.
- #{user_id}의 user_id의 값이 abc라면 쿼리문에는 USER_ID = 'abc'의 형태가 된다.
- 변수의 값을 직접 쿼리에 쓰는 대신, '?' 같은 표시자를 사용하고, 그 값은 나중에 안전하게 삽입
- SQL 인젝션 공격을 예방할 수 있어 보안 측면에서 유리
- 최초 1회 Hard Parsing이 이루어지고 그 다음부터는 캐시에서 가져오기 때문에 빈번한 Hard Parsing으로 인한 성능상 단점을 보완할 수 있다. 매번 실행계획이 같다.
<select id="select_list" parameterType="HashMap" resultType="HashMap">
SELECT USER_NM
, USER_ID
FROM USER
WHERE USER_ID = #{USER_ID}
AND USER_PWD = #{USER_PWD}
</select>
원문
1. #The incoming data as a string, the incoming data to automatically add a double quotation marks. Such as: order by #{user_id}, if the incoming value is 111, then parsed into SQL values for the order by'111', if its value is ID, then parsed into SQL order by 'id'. 2. $The incoming data directly display generation in sql. Such as: order by ${user_id}, if the incoming value is 111, then parsed into SQL when the value of order by 111, if its value is ID, then parsed into SQL order by ID. 3. #Can significantly prevent SQL injection. 4.$Unable to prevent Sql injection. 5.$General way for incoming database objects, such as into the table name, column names 6 in general can be used # don't use$. Need to pay attention to using the order by dynamic parameters of MyBatis ranking, with $instead# String replace By default, the use of #{} format syntax will cause MyBatis to create pretreatment statement attributes and used it as the setting value (such as security?). It is safe to do this very quickly, also is the preferred approach, sometimes you just want to directly insert a does not change the string in the SQL statement. For example, like ORDER BY, you can use: ORDER BY ${columnName} This MyBatis does not modify or string literal. Important: to accept from the user output and provides the string to the statement unchanged, it is unsafe to do so. This leads to potential SQL injection attacks, therefore you should not allow the user to enter these fields, or often to escape and check. |
[참고]
https://velog.io/@reasonoflife39/MyBatis에서-안전한-데이터-처리-변수와-변수의-차이점
https://logical-code.tistory.com/25
https://parksuseong.blogspot.com/2019/06/mybatis-difference-between-and-in.html
반응형
'Develops > SQL' 카테고리의 다른 글
[PostgreSQL] GENERATE_SERIES 사용 예시 (범위 안의 일련의 값 생성) (0) | 2024.07.21 |
---|---|
[Tibero] AGGR_CONCAT 함수 (여러 행을 하나의 값으로 합치기) (0) | 2024.07.14 |
[ORACLE] RANK, DENSE_RANK, ROW_NUMBER 함수 (중복여부, 생략여부) (0) | 2024.03.30 |
[ORACLE] PIVOT, UNPIVOT 함수 (행을 열로, 열을 행으로 변환) (0) | 2024.03.26 |
[ORACLE] 계층형 쿼리( START WITH ... CONNECT BY / LEVEL 활용 ) (0) | 2024.03.26 |