나는 최근에 mybatis를 사용하고 있습니다. 나는 전에 ibatis를 사용했습니다. 전반적으로 비슷하지만 여전히 많은 문제가 발생했습니다. 다시 녹음하겠습니다.
먼저 mybatis에서 #{}와 $ {}의 차이점을 다음과 같이 소개하겠습니다.
1. # 모든 들어오는 데이터를 문자열로 처리하고 자동으로 들어오는 데이터에 이중 인용문을 추가하십시오. 예를 들면 : #user_id #의 주문, 전달 된 값이 111 인 경우 SQL로 구문 분석 할 때의 값은 "111"으로 주문됩니다. 통과 된 값이 ID 인 경우 SQL로 구문 분석 된 것은 "id"로 주문됩니다.
2. $ 전달 된 데이터를 직접 표시하고 SQL로 생성합니다. 예를 들면 다음과 같습니다. $ user_id $로 주문하십시오. 전달 된 값이 ID 인 경우 SQL로 구문 분석 된 것은 ID로 주문됩니다.
3. # 메소드는 SQL 주입을 크게 방지 할 수 있습니다.
4. $ 방법은 SQL 주입을 방지 할 수 없습니다.
5. $ 메소드는 일반적으로 테이블 이름을 전달하는 것과 같은 데이터베이스 개체를 전달하는 데 사용됩니다.
6. 일반적으로 #을 사용할 수있는 경우 $를 사용하지 마십시오.
mybatis를 정렬 할 때 Dynamic 매개 변수 별 순서를 사용하는 경우 # 대신 $를 사용하는 데주의를 기울여야합니다.
문자열 교체
기본적으로 #{} 형식 구문을 사용하면 MyBatis가 전처리 된 명령문 속성을 생성하고 배경 (예 :?)으로 안전한 값을 설정하게합니다. 이것은 안전하고 빠르며 때로는 SQL 문으로 직접 변경되지 않는 문자열을 삽입하려고합니다. 예를 들어, 순서와 같이 다음과 같이 사용할 수 있습니다.
$ {columnname} 주문
여기서 mybatis는 줄을 수정하거나 탈출하지 않습니다.
중요 : 사용자로부터 컨텐츠 출력을 수락하여 명령문에서 변경되지 않은 문자열에 제공하는 것은 안전하지 않습니다. 이로 인해 잠재적 인 SQL 주입 공격이 발생할 수 있으므로 사용자가 이러한 필드에 들어가거나 일반적으로 탈출하여 직접 확인할 수 없습니다.
mybatis 자체에 대한 설명 :
#{} 구문을 사용하여 String CleditutionBy Default는 MyBatis가 PreperationStatement 속성을 생성하고 값을 준비 상태 매개 변수 (예 :?)에 대해 안전하게 설정하게합니다. 이것은 더 안전하고 빠르며 거의 항상 선호하지만 때로는 SQL 문에 수정되지 않은 문자열을 직접 주입하기를 원합니다. 예를 들어, 주문의 경우 다음과 같은 것을 사용할 수 있습니다. $ {collectname} 여기서 mybatis는 문자열을 수정하거나 탈출하지 않습니다. 이로 인해 잠재적 인 SQL 주입 공격이 발생하므로 이러한 필드에서 사용자 입력을 허용하지 않거나 항상 자신의 탈출 및 점검을 수행해야합니다. 위에서 볼 수 있습니다.
1. #{} 형식 구문을 사용하여 MyBatis에서 준비 문을 사용하여 값을 안전하게 설정하고 다음과 유사한 SQL을 실행하십시오.
preparedstatement ps = conn.preparestatement (sql); ps.setint (1, id);
이것의 이점은 더 안전하고 빠르며 일반적으로 선호되는 연습입니다.
2. 그러나 때로는 변하지 않은 문자열을 SQL 문에 직접 삽입하려고합니다. 예를 들어, 순서와 같이 다음과 같이 사용할 수 있습니다.
$ {columnname} 주문 현재 Mybatis는 문자열을 수정하거나 탈출하지 않습니다.
이 방법은 다음과 유사합니다.
Statement st = conn.createstatement (); resultSet rs = st.ExecuteQuery (SQL);
이 방법의 단점은 다음과 같습니다.
사용자로부터 컨텐츠 출력을 수락하고 이러한 방식으로 명령문에 변경되지 않은 문자열을 제공하는 것은 안전하지 않으므로 잠재적 인 SQL 주입 공격이 발생하므로 사용자는 이러한 필드를 입력하거나 탈출하여 스스로 확인할 수 없습니다.