MyBatis에서 #{}와 ${}의 차이점 상세 정보

2598 단어 mybatis#{}${}
최근에 mybatis를 사용했는데 이전에 ibatis를 사용한 적이 있는데 전체적으로 차이가 많지 않지만 많은 문제에 부딪혀 다시 기록되었다.
먼저 MyBatis의 #{}와 ${}의 차이점을 소개하겠습니다. 구체적으로 다음과 같습니다.
1. # 전송된 데이터를 문자열로 간주하면 자동으로 전송된 데이터에 이중 따옴표가 붙습니다.예: order by #user_id#, 전송된 값이 111이면 sql로 해석될 때의 값은order by'111'이고, 전송된 값이 id이면 sql이order by'id'로 해석됩니다.
2. $는 전송된 데이터를 sql에 직접 표시합니다.예: order by $user_id$, 전송된 값이 111이면 sql로 해석된 값은order by user_id, 만약 전송된 값이 id라면, 해석된 sql은order by id입니다.
3. # 방식은 sql 주입을 어느 정도 방지할 수 있다. 
4.$방식으로는 Sql 주입을 방지할 수 없습니다.
5.$방식은 일반적으로 데이터베이스 대상(예를 들어 테이블 이름)을 전송하는 데 사용된다.
6. 보통 #을 쓸 수 있는 것은 $를 쓰지 마세요.
MyBatis 정렬 시 order by 동적 매개 변수를 사용할 때 # 대신 $로 주의해야 합니다.
문자열 대체
기본적으로 # {} 형식의 구문을 사용하면 MyBatis가 사전 처리 문장 속성을 만들고 이를 배경으로 안전한 값을 설정합니다(예:?).이렇게 하는 것은 매우 안전하고 신속하며 최선의 방법이다. 때로는 SQL 문장에 변하지 않는 문자열을 직접 삽입하고 싶을 뿐이다.예를 들어, ORDER BY와 같이 다음과 같이 사용할 수 있습니다.
ORDER BY ${columnName}
여기서 MyBatis는 문자열을 수정하거나 이스케이프하지 않습니다.
중요: 사용자가 출력한 내용을 받아들여 문장에 변하지 않는 문자열을 제공하는 것은 안전하지 않다.이것은 잠재적인 SQL 주입 공격을 초래할 수 있기 때문에 사용자가 이 필드를 입력하거나 통상적으로 스스로 의미를 바꾸어 검사하는 것을 허락해서는 안 된다.
mybatis 자체의 설명:

String Substitution
By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:
ORDER BY ${columnName}
Here MyBatis won't modify or escape the string.
NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks. 
위에서 보듯이
1. #{} 형식의 문법을 사용하여 mybatis에서 Preparement 문구를 사용하여 안전하게 값을 설정하고 sql와 유사한 다음을 수행합니다.

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id); 
이렇게 하는 장점은 더욱 안전하고 신속하며 통상적으로 첫 번째 방법이다.
2. 그러나 때때로 당신은 SQL 문장에 변하지 않는 문자열을 직접 삽입하고 싶을 뿐이다.예를 들어, ORDER BY와 같이 다음과 같이 사용할 수 있습니다.

ORDER BY ${columnName} 
이 때 MyBatis는 문자열을 수정하거나 이스케이프하지 않습니다.
이와 유사한 방식:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql); 
이런 방식의 단점은 다음과 같다.
이러한 방식으로 사용자로부터 출력된 내용을 받아들여 문장에 변하지 않는 문자열을 제공하는 것은 안전하지 않으며 잠재적인 SQL 주입 공격을 초래할 수 있기 때문에 사용자가 이 필드를 입력하지 못하게 하거나 스스로 의미를 바꾸어 검사할 수 있다.

좋은 웹페이지 즐겨찾기