MyBatis에서 #{}와 ${}의 차이점 상세 정보
먼저 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 주입 공격을 초래할 수 있기 때문에 사용자가 이 필드를 입력하지 못하게 하거나 스스로 의미를 바꾸어 검사할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.